From 39b7116649805ea005db7a1df6be54a718040132 Mon Sep 17 00:00:00 2001 From: Armen Avagumyan Date: Wed, 20 May 2026 23:52:58 +0400 Subject: [PATCH] feat: planning public api v2 --- gatsby-config.js | 4 + src/pages/api/v2.md | 5 + src/pages/index.md | 361 +- static/v1.json | 7702 ++++++++++++++++++++++++++++++++++++++----- static/v2.json | 7328 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 14565 insertions(+), 835 deletions(-) create mode 100644 src/pages/api/v2.md create mode 100644 static/v2.json diff --git a/gatsby-config.js b/gatsby-config.js index 984d76f..48d00b7 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -24,6 +24,10 @@ module.exports = { { title: 'V1', path: '/api/v1.md' + }, + { + title: 'V2', + path: '/api/v2.md' } ] } diff --git a/src/pages/api/v2.md b/src/pages/api/v2.md new file mode 100644 index 0000000..63e12d1 --- /dev/null +++ b/src/pages/api/v2.md @@ -0,0 +1,5 @@ +--- +title: WF Planning API V2 +description: WF Planning API V2 instructions +openAPISpec: /v2.json +--- diff --git a/src/pages/index.md b/src/pages/index.md index 1dd65e5..307902d 100644 --- a/src/pages/index.md +++ b/src/pages/index.md @@ -11,18 +11,365 @@ The Adobe Workfront Planning API provides a REST-ful architecture to simplify in ## Overview -The Adobe Workfront Planning API aims to facilitate integration with the Planning feature by leveraging a REST-ful design over HTTP. It is designed for users familiar with REST and JSON responses, and it operates by manipulating objects via their unique URIs using standard HTTP methods. +The Adobe Workfront Planning API facilitates integration with the Planning feature via a REST-ful design over HTTP. It is designed for users familiar with REST and JSON, manipulating objects via unique URIs using standard HTTP methods. -More details on the API can be found in the [References Adobe Workfront Planning API Basics](https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-planning/adobe-workfront-planning-general-information/planning-api-basics). +More details can be found in the [Adobe Workfront Planning API Basics](https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-planning/adobe-workfront-planning-general-information/planning-api-basics). -## Discover +## API References ### Get Started -Familiarize yourself with the basics of the Workfront Planning API, including how to make HTTP requests and utilize the various methods for CRUD operations. +Familiarize yourself with the Workfront Planning API: HTTP requests, CRUD operations, and available resources. -### API References -Detailed documentation on the Workfront Planning API methods, parameters, and responses can be found below: - - **[V1](/api/v1/)** \ No newline at end of file +### Versions + - **[V1](/api/v1/)** + - **[V2](/api/v2/)** + +--- + +## V1 vs V2 — What's New + +Version 2 of the Workfront Planning API is a significant expansion of what you can build. If you're new to the API, V2 is where to start. If you're on V1, this page covers everything that changed and exactly what to update. + +### New capabilities in V2 + +These features are available for the first time in V2 and are not available in V1. + +#### Full platform CRUD + +V1 was limited to reading workspaces and record types, with CRUD only for records. V2 gives you full create, update, and delete access across the entire Planning object model. + +| Resource | V1 | V2 | +| ------------ | ------------------------ | ------------------------------------ | +| Workspaces | `GET` only | `GET`, `POST`, `PUT`, `PATCH`, `DELETE` | +| Record types | `GET` only | `GET`, `POST`, `PUT`, `PATCH`, `DELETE` | +| Fields | Not available | `GET`, `POST`, `PUT`, `PATCH`, `DELETE` | +| Records | `GET`, `POST`, `PUT`, `DELETE` | `GET`, `POST`, `PUT`, `PATCH`, `DELETE` | +| Views | Not available | `GET`, `POST`, `PUT`, `PATCH`, `DELETE` | + +This means you can now build integrations that provision workspaces, scaffold record types and fields, and manage records entirely through the API — without any manual setup in the UI. + +#### Partial updates with PATCH + +V2 adds `PATCH` support with JSON merge-patch semantics. Only the fields you include in the request body are updated — everything else is left unchanged. No more sending a full resource payload to change a single field. + +``` +PATCH /v2/workspaces/{id} +{ + "description": "Updated description only" +} +``` + +#### Bulk record operations + +V2 introduces dedicated bulk endpoints for records, allowing you to create, update, patch, or delete large volumes of records in a single API call. + +| Operation | Endpoint | Max per request | +| ------------ | ------------------------------------------------- | --------------- | +| Bulk create | `POST /v2/record-types/{id}/records/bulk` | 100 | +| Bulk update | `PUT /v2/record-types/{id}/records/bulk` | 100 | +| Bulk patch | `PATCH /v2/record-types/{id}/records/bulk` | 100 | +| Bulk delete | `DELETE /v2/record-types/{id}/records/bulk` | 100 | + +Bulk endpoints return `201 Created` when every row succeeds and `207 Multi-Status` for partial success — inspect the per-row results envelope to identify which records failed and why. + +#### Bulk reorder and move + +Move or reorder records across positions in a single call: + +``` +POST /v2/record-types/{recordTypeId}/records/move +``` + +#### Record thumbnails + +Upload or remove a thumbnail image for a record: + +``` +POST /v2/records/{id}/thumbnail → 201 Created +DELETE /v2/records/{id}/thumbnail → 204 No Content +``` + +#### Global record types + +List record types that are globally available within a workspace: + +``` +GET /v2/workspaces/{workspaceId}/global-record-types +``` + +#### Detach a dynamic record type + +Detach a dynamic record type from its source so it becomes a standalone record type: + +``` +POST /v2/workspaces/{workspaceId}/record-types/{recordTypeId}/detach +``` + +#### History API + +V2 exposes a dedicated History API for retrieving change history on Planning resources, enabling auditing and timeline integrations. + +#### Permissions API + +V2 introduces a dedicated Permissions API for reading and managing access programmatically, including workspace and record type member management, access request workflows, and permission inheritance, using the below endpoints: + +``` +GET /v2/permissions/{resourceType}/{resourceId} +GET /v2/permissions/{resourceType}/{resourceId}/members +GET /v2/permissions/{resourceType}/{resourceId}/inheritance +GET /v2/permissions/{resourceType}/{resourceId}/requests +DELETE /v2/permissions/{resourceType}/{resourceId}/requests +PATCH /v2/permissions/{resourceType}/{resourceId}/members +POST /v2/permissions/{resourceType}/{resourceId}/requests +``` + +In these endpoints `resourceType` represents the entity type, and `resourceId` represents the specific entity for which the permissions are being checked. The `resourceType` can take one of the following values: `workspaces`, `record-types`, `records`, `views`. + +For example, the endpoint below will return the list of people who have access to the workspace with ID `Ws6a0475de4ecced960185e1e1`: + +``` +GET /v2/permissions/workspaces/Ws6a0475de4ecced960185e1e1/members +``` + +#### Full OpenAPI 3.x specification + +All V2 endpoints, request bodies, response shapes, and filter schemas are fully documented in the live OpenAPI spec — including search filter schemas that were undocumented in V1. + +#### Platform limits + +V2 surfaces and enforces explicit platform limits. Plan integrations accordingly: + +| Limit | Value | +| ------------------------------------------ | ------- | +| Records per bulk request | 100 | +| Fields per record type (total) | 500 | +| `PARAGRAPH` fields per record type | 20 | +| `FORMULA` fields per record type | 20 | +| `REFERENCE` fields per record type | 30 | +| Personal views per record type | 100 | +| Workspaces per tenant | 100,000 | + +### V1 vs V2 — what changed + +For developers migrating from V1, the table below covers every breaking change and where it affects your integration. + +| Area | V1 | V2 | Impact | +| --------------------- | ------------------------------------------- | ----------------------------------------------------------- | ----------------------- | +| Base URL | `/maestro/api/v1/` | `/maestro/api/v2/` | All requests | +| Record type listing | `GET /v1/record-types?workspaceId={id}` | `GET /v2/workspaces/{id}/record-types` | URL update required | +| Record creation | `POST /v1/records` (`recordTypeId` in body) | `POST /v2/record-types/{id}/records` | URL + body update | +| Record search | `GET` or `POST /v1/records/search` | `GET` or `POST /v2/record-types/{id}/records/search` | URL update | +| Create status code | `200 OK` | `201 Created` | Error handling update | +| Delete status code | `200 OK` | `204 No Content` | Error handling update | +| Pagination | `offset`/`limit` in request body | Cursor-based (listings) or `page`/`size` query params (search) | Pagination logic update | +| Pagination response | `{ records, totalCount }` | `{ records, page }` (search) or `{ content, cursor }` (listings) | Response parsing update | +| Filter syntax | Mongo-style `$and`, `$is`, `$contains` | Typed enums `AND`, `IS`, `CONTAINS` | Filter rebuild required | +| Filter location | `recordTypeId` in body | `recordTypeId` in URL path | URL + body update | +| Partial updates | `PUT` only (full replacement) | `PATCH` available (merge-patch) | Optional adoption | +| Error code format | Numeric `type` (e.g. `40001`) | String `errorCode` (e.g. `VALIDATION_FAILED`) | Error handling update | +| Error structure | `report.detailedMessage` wrapper | RFC 7807 problem+json with `errors[]` array | Error parsing update | +| Field projection | `?attributes=` | `?fieldIds=` or `?fieldAliases=` | Query param update | +| Sorting key | `sorting` array | `sort` array | Request body update | +| `createdBy` / `updatedBy` | Plain ID string | Object `{ id, name }` | Response parsing update | +| `customerId` / `imsOrgId` | Present in responses | No longer returned in responses | Response parsing update | +| Bulk operations | Not available | `/records/bulk` endpoints | New capability | +| Permissions API | Not available | `/v2/permissions/` | New capability | +| Permissions in response | Embedded in resource DTO | Removed — use Permissions API | Response parsing update | + +### Migration guide — updating from V1 to V2 + +Work through the checklist below in order. Each step includes before/after examples. + +#### 1. Update your base URL + +Change the version segment in all request URLs from `/v1/` to `/v2/`. Single-resource GETs by ID keep the same path pattern (e.g. `GET /v2/workspaces/{id}` and `GET /v2/record-types/{id}`), but the **listing** path for record types did change — see step 2. + +``` +Before: https://{customer-domain}/maestro/api/v1/workspaces +After: https://{customer-domain}/maestro/api/v2/workspaces +``` + +#### 2. Update record type listing + +Move `workspaceId` from a query parameter to the URL path. + +``` +Before: GET /v1/record-types?workspaceId={id} +After: GET /v2/workspaces/{id}/record-types +``` + +#### 3. Update record creation and search + +Move `recordTypeId` from the request body to the URL path for both create and search. + +Create: + +``` +Before: POST /v1/records { "recordTypeId": "Rt123", ... } +After: POST /v2/record-types/Rt123/records { ... } +``` + +Search: + +``` +Before: POST /v1/records/search { "recordTypeId": "Rt123", ... } +After: POST /v2/record-types/Rt123/records/search { ... } +``` + +Both `GET` and `POST` variants of search remain supported in V2 at `/v2/record-types/{id}/records/search`. + +#### 4. Handle new HTTP status codes + +Update any logic that checks response status codes for create and delete operations. + +``` +POST (create): 200 → 201 Created +DELETE: 200 → 204 No Content +Bulk (partial): — → 207 Multi-Status +``` + +Bulk endpoints return `201` when every row succeeds and `207 Multi-Status` when some rows fail — make sure your client inspects per-row results in the response envelope. + +#### 5. Update pagination + +Remove `offset`/`limit` from the request body. Move to query parameters and update response parsing. + +Record search: + +``` +Before (body): { "offset": 0, "limit": 50 } +After (query): ?page=0&size=50 + +Before (response): { "records": [...], "totalCount": 150 } +After (response): { + "records": [...], + "groups": [...], // present only on grouped searches + "page": { "size": 50, "number": 0, "totalElements": 150, "totalPages": 3 } + } +``` + +Workspace and record type listings (cursor-based): + +``` +GET /v2/workspaces?limit=20&cursor={nextCursor} + +Response: { "content": [...], "cursor": { "hasMore": true, "nextCursor": "..." } } +``` + +#### 6. Update search filter syntax + +Rebuild filters using typed enum operators. Move pagination params and `recordTypeId` out of the filter body. + +Before (V1): + +``` +{ + "recordTypeId": "Rt123", + "filters": { + "$and": [ + { "fieldId": { "$is": "Active" } }, + { "fieldId": { "$contains": "marketing" } } + ] + }, + "offset": 0, + "limit": 50 +} +``` + +After (V2): + +``` +POST /v2/record-types/Rt123/records/search?page=0&size=50 +{ + "filter": { + "operator": "AND", + "conditions": [ + { "fieldId": "", "condition": "IS", "value": "Active" }, + { "fieldId": "", "condition": "CONTAINS", "value": "marketing" } + ] + } +} +``` + +#### 7. Update error handling + +Replace numeric `type` checks with string `errorCode` checks. Update any code that reads from the `report` wrapper. V2 error responses are RFC 7807-compatible (`application/problem+json`) with Planning-specific extensions. + +Before (V1): + +``` +{ + "type": 40001, + "title": "Invalid Data", + "report": { "detailedMessage": "Field name cannot be empty" } +} +``` + +After (V2): + +``` +{ + "title": "Validation failed", + "status": 400, + "detail": "Request validation failed.", + "errorCode": "VALIDATION_FAILED", + "messageArguments": { }, + "requestId": "b7c3...e1", + "errors": [ + { "field": "name", "message": "must not be blank" } + ] +} +``` + +Switch on the stable `errorCode` enum (e.g. `VALIDATION_FAILED`, `NOT_FOUND`, `CONFLICT`, `FORBIDDEN`, `UNAUTHORIZED`, `INTERNAL_ERROR`) rather than the HTTP status or `title`. Always capture `requestId` in client logs — support tickets are resolved much faster with it. + +#### 8. Remove permissions from resource response parsing + +V2 no longer includes permission level in resource DTOs. Switch to the Permissions API for any integration that reads the permission field from workspace or record type responses. + +``` +GET /v2/permissions/{resourceType}/{resourceId} +``` + +#### 9. Update response field parsing + +`customerId` and `imsOrgId` are no longer returned in responses — remove any client parsing for them. Update `createdBy` and `updatedBy` parsing from a plain string to an object. + +``` +Before: "createdBy": "user123" +After: "createdBy": { "id": "user123", "name": "Jane Doe" } +``` + +#### 10. Update field projection + +Replace the `?attributes=` query parameter with `?fieldIds=` or `?fieldAliases=`. + +``` +Before: /v1/records/search?attributes=data,createdBy +After: /v2/record-types/{id}/records/search?fieldIds=F123,F456 +``` + +#### 11. Update sorting key + +Rename the `sorting` array key to `sort` in search request bodies. + +``` +Before: { "sorting": [{ "fieldId": "F123", "direction": "asc" }] } +After: { "sort": [{ "fieldId": "F123", "direction": "asc" }] } +``` + +#### 12. Adopt PATCH for partial updates (recommended) + +Not a breaking change — `PUT` still works — but switching updates to `PATCH` reduces payload size and eliminates the risk of accidentally nulling fields. + +#### 13. Adopt bulk endpoints for high-volume record operations (recommended) + +If your integration creates, updates, or deletes records in loops, replace individual calls with the `/records/bulk` endpoints for significantly better performance. Remember to handle `207 Multi-Status` for partial success. + +### Next steps + +- [Full API V2 reference](/api/v2/) +- [API Basics](https://experienceleague.adobe.com/en/docs/workfront/using/adobe-workfront-planning/adobe-workfront-planning-general-information/planning-api-basics) — authentication, filtering, pagination, and field types diff --git a/static/v1.json b/static/v1.json index 824d489..fa289c1 100644 --- a/static/v1.json +++ b/static/v1.json @@ -1,9 +1,9 @@ { - "openapi": "3.0.1", + "openapi": "3.1.0", "info": { "title": "Workfront Planning API", "description": "This is WF Planning Service API documentation. WF Planning Service is responsible for creating and managing new workspace, field, record, record type objects across the Workfront application and Adobe DX infrastructure.", - "version": "v1" + "version": "v2" }, "servers": [ { @@ -14,69 +14,100 @@ "tags": [ { "name": "Workspaces", - "description": "Workspace Controller" + "description": "Workspace management. Limits: max 100,000 workspaces per tenant; max 256 characters for workspace name." }, { "name": "Record Types", - "description": "Record Type Controller" + "description": "Record type management. Limits: max 100 record types per workspace; max 255 characters for display name." }, { "name": "Records", - "description": "Record Controller" + "description": "Record management. Limits: max 25,000 records per record type; max 100 records per bulk operation; max 500 connections per reference field; max 10 connections per hierarchy field." + }, + { + "name": "Fields", + "description": "Field management. Per-record-type quotas: max 500 fields total; max 20 PARAGRAPH (long-text) fields; max 20 FORMULA fields; max 30 REFERENCE fields. Field display names must be unique within a record type and capped at 256 characters. Formula expressions: max 50,000 characters; lookup depth: max 5." + }, + { + "name": "Views", + "description": "View management. Limits: max 100 personal views per record type; max 255 characters for view name." + }, + { + "name": "Permissions", + "description": "Resource permissions, member management, and access requests." + }, + { + "name": "Limits and Quotas", + "description": "Public API V2 limits and quotas:\n\n- Workspaces per tenant: 100,000\n- Record types per workspace: 100\n- Records per record type: 25,000\n- Records per bulk request: 100\n- Fields per record type: 500\n- PARAGRAPH (long-text) fields per record type: 20\n- FORMULA fields per record type: 20\n- REFERENCE fields per record type: 30\n- Connections per reference field: 500\n- Connections per hierarchy field: 10\n- Personal views per record type: 100\n- Lookup depth: 5\n- Hierarchy depth: 4\n- Hierarchy count per workspace: 5\n- Formula expression length: 50,000 characters\n- Display name length: 256 characters\n\nExceeding any of these limits returns an HTTP 403 with a specific `errorCode` (e.g. `RECORD_TYPE_LIMIT_EXCEEDED`, `FIELD_LIMIT_EXCEEDED`, `VIEW_LIMIT_EXCEEDED`)." } ], "paths": { - "/v1/records/{id}": { + "/v2/workspaces/{id}": { "get": { "tags": [ - "Records" + "Workspaces" ], - "summary": "Get Record", - "description": "Retrieve a specific record by its ID along with optional attributes.", - "operationId": "getRecord", + "summary": "Get Workspace", + "description": "Retrieve a workspace by its ID.", + "operationId": "getWorkspace", "parameters": [ { "name": "id", "in": "path", - "description": "ID of the record to be retrieved", + "description": "ID of the workspace to be retrieved", "required": true, "schema": { "type": "string" } - }, - { - "name": "aliased", - "in": "query", - "description": "Flag to include alias support", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/RecordDto" + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" } } } @@ -85,16 +116,16 @@ }, "put": { "tags": [ - "Records" + "Workspaces" ], - "summary": "Update Record", - "description": "Update an existing record with the given ID and details.", - "operationId": "updateRecord", + "summary": "Update Workspace", + "description": "Update an existing workspace using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateWorkspace", "parameters": [ { "name": "id", "in": "path", - "description": "ID of the record to be updated", + "description": "ID of the workspace to be updated", "required": true, "schema": { "type": "string" @@ -105,7 +136,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RecordDto" + "$ref": "#/components/schemas/WorkspaceBaseDto" } } }, @@ -115,9 +146,69 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/RecordDto" + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" } } } @@ -126,16 +217,16 @@ }, "delete": { "tags": [ - "Records" + "Workspaces" ], - "summary": "Delete Record by ID", - "description": "Delete a specific record by its ID.", - "operationId": "deleteRecord", + "summary": "Delete Workspace", + "description": "Delete a workspace by its ID.", + "operationId": "deleteWorkspace", "parameters": [ { "name": "id", "in": "path", - "description": "ID of the record to be deleted", + "description": "ID of the workspace to be deleted", "required": true, "schema": { "type": "string" @@ -143,25 +234,74 @@ } ], "responses": { - "200": { - "description": "OK" + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } } } - } - }, - "/v1/records": { - "post": { + }, + "patch": { "tags": [ - "Records" + "Workspaces" + ], + "summary": "Patch Workspace", + "description": "Partially update a workspace using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchWorkspace", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the workspace to be patched", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Create Record", - "description": "Create a new record with the given details.", - "operationId": "createRecord", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RecordDto" + "$ref": "#/components/schemas/WorkspaceBaseDto" } } }, @@ -171,182 +311,171 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/RecordDto" + "$ref": "#/components/schemas/WorkspaceBaseDto" } } } - } - } - } - }, - "/v1/records/search": { - "get": { - "tags": [ - "Records" - ], - "summary": "Search Records by field values", - "description": "Search for records based on specific field values.", - "operationId": "searchRecordsGet", - "parameters": [ - { - "name": "recordTypeId", - "in": "query", - "description": "Id of the record type", - "required": false, - "schema": { - "type": "string" - } }, - { - "name": "recordTypeAlias", - "in": "query", - "description": "Alias of the record type", - "required": false, - "schema": { - "type": "string" + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } } }, - { - "name": "aliased", - "in": "query", - "description": "Flag to include alias support", - "required": false, - "schema": { - "type": "boolean" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } } }, - { - "name": "filters", - "in": "query", - "description": "Filters", - "required": false, - "schema": { - "type": "string" + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } } }, - { - "name": "groupingFieldIds", - "in": "query", - "description": "Grouping field ids", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } } } }, - { - "name": "offset", - "in": "query", - "description": "Offset", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } } }, - { - "name": "limit", - "in": "query", - "description": "Limit", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 500 + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } } - }, + } + } + } + }, + "/v2/views/{id}": { + "get": { + "tags": [ + "Views" + ], + "summary": "Get View", + "description": "Retrieve a view by its ID.", + "operationId": "getView", + "parameters": [ { - "name": "rowOrderViewId", - "in": "query", - "description": "Row order view id", - "required": false, + "name": "id", + "in": "path", + "description": "ID of the view to be retrieved", + "required": true, "schema": { "type": "string" } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/GroupedRecordsDto" + "$ref": "#/components/schemas/ViewDto" } } } - } - } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } }, - "post": { + "put": { "tags": [ - "Records" + "Views" ], - "summary": "Search Records by field values", - "description": "Search for records based on specific field values.", - "operationId": "searchRecordsPost", + "summary": "Update View", + "description": "Update an existing view using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateView", "parameters": [ { - "name": "recordTypeAlias", - "in": "query", - "description": "Alias of the record type", - "required": false, + "name": "id", + "in": "path", + "description": "ID of the view to be updated", + "required": true, "schema": { "type": "string" } - }, - { - "name": "aliased", - "in": "query", - "description": "Flag to include alias support", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RecordSearchDto" + "$ref": "#/components/schemas/ViewDto" } } }, @@ -356,150 +485,234 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/GroupedRecordsDto" + "$ref": "#/components/schemas/ViewDto" } } } - } - } - } - }, - "/v1/workspaces": { - "get": { - "tags": [ - "Workspaces" - ], - "summary": "Get All Workspaces", - "description": "Retrieve a list of all workspaces along with optional attributes.", - "operationId": "getWorkspaces", - "parameters": [ - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" - } - ], - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/WorkspaceListDto" + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" } } } } } - } - }, - "/v1/workspaces/{id}": { - "get": { + }, + "delete": { "tags": [ - "Workspaces" + "Views" ], - "summary": "Get Workspace", - "description": "Retrieve a workspace by its ID along with optional attributes.", - "operationId": "getWorkspace", + "summary": "Delete View", + "description": "Delete a view by its ID.", + "operationId": "deleteView", "parameters": [ { "name": "id", "in": "path", - "description": "ID of the workspace to be retrieved", + "description": "ID of the view to be deleted", "required": true, "schema": { "type": "string" } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/WorkspaceDto" + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" } } } } } - } - }, - "/v1/record-types": { - "get": { + }, + "patch": { "tags": [ - "Record Types" + "Views" ], - "summary": "Get Record Types of specified Workspace", - "description": "Retrieve a list of record types associated with a specified workspace. If a user has view access to workspaces, they gain visibility into all record types.", - "operationId": "getRecordTypes", + "summary": "Patch View", + "description": "Partially update a view using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchView", "parameters": [ { - "name": "workspaceId", - "in": "query", - "description": "ID of the workspace", + "name": "id", + "in": "path", + "description": "ID of the view to be patched", "required": true, "schema": { "type": "string" } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RecordTypeDto" - } + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" } } } @@ -507,222 +720,6056 @@ } } }, - "/v1/record-types/{id}": { + "/v2/records/{id}": { "get": { "tags": [ - "Record Types" + "Records" ], - "summary": "Get Record Type by ID", - "description": "Retrieve a specific record type by its ID along with optional attributes.", - "operationId": "getRecordType", + "summary": "Get Record", + "description": "Retrieve a record by its ID.", + "operationId": "getRecord", "parameters": [ { "name": "id", "in": "path", - "description": "ID of the record type to be retrieved", + "description": "ID of the record to be retrieved", "required": true, "schema": { "type": "string" } - }, - { - "name": "attributes", - "in": "query", - "description": "List of attributes to be included in the response", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "example": "ALL" } ], "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/RecordTypeDto" + "$ref": "#/components/schemas/RecordDto" } } } - } - } - } - } - }, - "components": { - "schemas": { - "CoverImage": { - "type": "object", - "properties": { + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Records" + ], + "summary": "Update Record", + "description": "Update an existing record using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_CONNECTION_LIMIT_EXCEEDED, HIERARCHY_RECORD_CONNECTION_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Delete Record", + "description": "Delete a record by its ID.", + "operationId": "deleteRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Records" + ], + "summary": "Patch Record", + "description": "Partially update an existing record using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged. Setting a field value to JSON null (e.g. {\"data\":{\"F123\":null}}) explicitly clears that field; omitting the key leaves the field untouched. For list-type fields (connections, multi-select), you can use operational updates: [{\"op\": \"add\", \"value\": [...]}, {\"op\": \"remove\", \"value\": [...]}].", + "operationId": "patchRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_CONNECTION_LIMIT_EXCEEDED, HIERARCHY_RECORD_CONNECTION_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/bulk": { + "put": { + "tags": [ + "Records" + ], + "summary": "Bulk Update Records", + "description": "Update multiple records using PUT semantics (full replacement). All fields not provided will be set to null. Each record must include an id. Limited to 100 records per request.", + "operationId": "bulkUpdateRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of records to update. Each must include an id (max 100).", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Bulk Create Records", + "description": "Create multiple records in a record type in a single request. Limited to 100 records per request.", + "operationId": "bulkCreateRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of records to create (max 100)", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "All items created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Bulk Delete Records", + "description": "Delete multiple records by their IDs in a single request. Limited to 100 records per request.", + "operationId": "bulkDeleteRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkDeleteRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request (empty ids list)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Records" + ], + "summary": "Bulk Patch Records", + "description": "Partially update multiple records using PATCH semantics (merge-patch). Only provided fields are updated; omitted fields remain unchanged. Each record must include an id. Limited to 100 records per request.", + "operationId": "bulkPatchRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of partial record updates. Each must include an id (max 100).", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items patched successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{id}": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Record Type", + "description": "Retrieve a record type by its ID.", + "operationId": "getRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be retrieved", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "scopeWorkspaceId", + "in": "query", + "description": "ID of the workspace to scope dynamic field resolution for global/dynamic record types", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Record Types" + ], + "summary": "Update Record Type", + "description": "Update an existing record type using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_IN_HIERARCHY)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Record Types" + ], + "summary": "Permanently delete record type", + "description": "Delete a record type and all its associated data, fields, and records. This action is irreversible.", + "operationId": "deleteRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_IN_HIERARCHY)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Record Types" + ], + "summary": "Patch Record Type", + "description": "Partially update a record type using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/fields/{id}": { + "get": { + "tags": [ + "Fields" + ], + "summary": "Get Field", + "description": "Retrieve a field by its ID.", + "operationId": "getField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be retrieved", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Fields" + ], + "summary": "Update Field", + "description": "Update an existing field using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Fields" + ], + "summary": "Delete Field", + "description": "Delete a field by its ID.", + "operationId": "deleteField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Fields" + ], + "summary": "Patch Field", + "description": "Partially update a field using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Get All Workspaces", + "description": "Retrieve a cursor-paginated list of all workspaces.", + "operationId": "getWorkspaces", + "parameters": [ + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-50, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 50, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseWorkspaceDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Workspaces" + ], + "summary": "Create Workspace", + "description": "Create a new workspace.", + "operationId": "createWorkspace", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (admin only, or WORKSPACE_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/record-types": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Record Types by Workspace", + "description": "Retrieve a cursor-paginated list of record types for a specific workspace.", + "operationId": "getRecordTypesByWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseRecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Record Types" + ], + "summary": "Create Record Type", + "description": "Create a new record type in a workspace. Subject to limits: max 100 record types per workspace.", + "operationId": "createRecordType", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "sectionIndex", + "in": "query", + "description": "Zero-based index of the section to add the record type to. Defaults to 0 (first section).", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0, + "minimum": 0 + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/record-types/{recordTypeId}/detach": { + "post": { + "tags": [ + "Record Types" + ], + "summary": "Detach record type from workspace", + "description": "Remove a dynamic (global) record type usage from a workspace. The underlying global record type and its data are preserved; only the workspace association is removed.", + "operationId": "detachRecordTypeFromWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type to detach", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/records/{id}/thumbnail": { + "post": { + "tags": [ + "Records" + ], + "summary": "Upload thumbnail on record", + "description": "Replace the record's thumbnail with the uploaded image. Each successful upload produces a new URL, even for identical content.", + "operationId": "uploadThumbnail", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary", + "description": "PNG or JPEG image file" + } + }, + "required": [ + "file" + ] + } + } + } + }, + "responses": { + "201": { + "description": "Thumbnail uploaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Invalid image (THUMBNAIL_EMPTY, THUMBNAIL_INVALID_FORMAT, THUMBNAIL_INVALID_CONTENT, THUMBNAIL_SIZE_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "413": { + "description": "Upload too large (UPLOAD_SIZE_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Delete thumbnail on record", + "description": "Remove the record's thumbnail. Idempotent — succeeds with 204 even when no thumbnail is set.", + "operationId": "deleteThumbnail", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Thumbnail removed" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/views": { + "get": { + "tags": [ + "Views" + ], + "summary": "Get Views by Record Type", + "description": "Retrieve a cursor-paginated list of views for a specific record type.", + "operationId": "getViewsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseViewDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Views" + ], + "summary": "Create View", + "description": "Create a new view for a record type. Subject to limits: max 100 personal views per record type.", + "operationId": "createView", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (VIEW_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records": { + "get": { + "tags": [ + "Records" + ], + "summary": "Get Records by Record Type", + "description": "Retrieve a page-based paginated list of records for a specific record type. Uses standard page/size query parameters (default page=0, size=20, sorted by createdAt).", + "operationId": "getRecordsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 20, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "default": [ + "createdAt,ASC" + ], + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PageRecordDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Create Record", + "description": "Create a new record in a record type. Subject to limits: max 25,000 records per record type.", + "operationId": "createRecord", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_RECORD_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/search": { + "get": { + "tags": [ + "Records" + ], + "summary": "Search Records (GET)", + "description": "Search records using query parameters. Accepts a JSON filter string using the composite filter pattern, field projection, and alias-based field access. Returns page-based paginated records along with group information.", + "operationId": "searchRecordsGet", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "recordTypeAlias", + "in": "query", + "description": "Alias of the record type", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "filter", + "in": "query", + "description": "JSON filter using the composite filter pattern. Example: {\"operator\":\"AND\",\"conditions\":[{\"fieldId\":\"status\",\"condition\":\"IS\",\"value\":\"Active\"}]}", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "groupingFieldIds", + "in": "query", + "description": "List of field IDs to group results by", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e000,F693ab1c96f11ea3f4175e001" + }, + { + "name": "scopeWorkspaceIds", + "in": "query", + "description": "List of workspace IDs to scope the search to (for global record types)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "example": "Ws123,Ws456" + }, + { + "name": "globalRecordTypeWorkspaceFieldId", + "in": "query", + "description": "ID of the global record type workspace field (for global record types)", + "required": false, + "schema": { + "type": "string" + }, + "example": "F693ab1c96f11ea3f4175e717" + }, + { + "name": "fieldIds", + "in": "query", + "description": "List of field IDs to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e710,F693ab1c96f11ea3f4175e711" + }, + { + "name": "fieldAliases", + "in": "query", + "description": "List of field aliases to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "name,description" + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchPageDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid filter parameter)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Search Records (POST)", + "description": "Search records using the composite filter pattern with strongly-typed conditions. Supports recursive AND/OR filter nesting, sorting, grouping, field projection, and alias-based field access. Returns page-based paginated records along with group information.", + "operationId": "searchRecordsPost", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "fieldIds", + "in": "query", + "description": "List of field IDs to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e710,F693ab1c96f11ea3f4175e711" + }, + { + "name": "fieldAliases", + "in": "query", + "description": "List of field aliases to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "name,description" + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchPageDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid filter / sort / group)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/move": { + "post": { + "tags": [ + "Records" + ], + "summary": "Move Records", + "description": "Reorder one or more records within a record type by specifying where to place them. Provide exactly one of putAfterRecordId (place after) or putBeforeRecordId (place before). Maximum 100 records per request. Requires EDIT permission on the record type. Move is all-or-nothing: on failure, no records are reordered.", + "operationId": "moveRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MoveRecordsRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items moved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Move failed — all records remain in original positions", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid move request)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type or anchor record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/fields": { + "get": { + "tags": [ + "Fields" + ], + "summary": "Get Fields by Record Type", + "description": "Retrieve a cursor-paginated list of fields for a specific record type.", + "operationId": "getFieldsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseFieldDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Fields" + ], + "summary": "Create Field", + "description": "Create a new field in a record type. Subject to limits: max 500 fields per record type, max 20 long-text fields, max 20 formula fields, max 30 reference fields per record type.", + "operationId": "createField", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_LIMIT_EXCEEDED, LONG_TEXT_FIELD_LIMIT_EXCEEDED, FORMULA_FIELD_COUNT_LIMIT_EXCEEDED, REFERENCE_FIELDS_COUNT_LIMIT_EXCEEDED, FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/requests": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "List pending access requests for a resource", + "description": "Returns all pending access requests for the given resource. Requires MANAGE permission.", + "operationId": "getAccessRequests", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessRequestDto" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Permissions" + ], + "summary": "Request access to a resource", + "description": "Creates or updates an access request for the current user on the given resource.", + "operationId": "createAccessRequest", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Object containing the ID of the created access request", + "example": { + "id": "AR1234567890" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Permissions" + ], + "summary": "Dismiss access requests", + "description": "Dismisses the specified access requests by ID. Requires MANAGE permission.", + "operationId": "deleteAccessRequests", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteAccessRequestsDto" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/members": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get all members and their roles for a resource", + "description": "Lists all subjects (users, groups, teams) that have an explicit sharing relation on the resource. Requires MANAGE permission.", + "operationId": "getMembers", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MemberPermissionDto" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Permissions" + ], + "summary": "Bulk grant, update, or revoke member permissions", + "description": "Grants new roles, changes existing roles, or revokes access for the provided subjects. Requires MANAGE permission.", + "operationId": "updateMembers", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMembersRequestDto" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/global-record-types": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Global Record Types", + "description": "Retrieve a cursor-paginated list of global record types available to attach to a specific workspace.", + "operationId": "getGlobalRecordTypes", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseRecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/records/{id}/history": { + "get": { + "tags": [ + "Records" + ], + "summary": "Get Record Field Change History", + "description": "Retrieve a cursor-paginated list of field change events for a specific record.", + "operationId": "getHistory", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-50, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 50, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseHistoryEntryDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid cursor or limit)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get current user's effective permissions on a resource", + "description": "Returns the current user's effective canView, canEdit, canDelete, and canAdd flags for the given resource.", + "operationId": "getMyPermissions", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/inheritance": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get inheritance setting for a record-type", + "description": "Returns whether workspace members inherit their workspace-level access on the record type. Only valid for record-types.", + "operationId": "getInheritance", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (must be record-types)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InheritanceDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "RecordTypeSectionDto": { + "type": "object", + "description": "Section for organizing and grouping record types within a workspace. Sections are ordered by their position in the array.", + "properties": { + "displayName": { + "type": "string", + "description": "Display name of the record type section", + "example": "Marketing", + "maxLength": 256, + "minLength": 0 + }, + "recordTypeIds": { + "type": "array", + "description": "List of record type IDs included in this section", + "items": { + "type": "string" + } + } + }, + "required": [ + "displayName" + ] + }, + "UserReferenceDto": { + "type": "object", + "description": "Reference to a user with identifier and display name", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the user", + "example": "1C341E7B682505430A494138@0bd0200063c87f9749412b.e", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Display name of the user", + "example": "Jane Doe", + "readOnly": true + } + } + }, + "WorkspaceBaseDto": { + "type": "object", + "description": "Base class for Workspace DTOs containing common workspace properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "Ws69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the workspace", + "example": "marketing-workspace", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Display name of the workspace. Maximum 256 characters; cannot be blank.", + "example": "Marketing Workspace", + "maxLength": 256, + "minLength": 0, + "pattern": "(?s)^\\s*\\S.*$" + }, + "description": { + "type": "string", + "description": "Description of the workspace purpose and content. Maximum 1024 characters.", + "example": "Workspace for managing marketing campaigns and assets", + "maxLength": 1024, + "minLength": 0 + }, + "color": { + "type": "string", + "description": "Color theme for the workspace", + "example": "blue" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the workspace", + "example": "briefcase" + }, + "ownerId": { + "type": "string", + "description": "User ID of the workspace owner", + "example": "1C341E7B682505430A494138@0bd0200063c87f9749412b.e" + }, + "recordTypeSections": { + "type": "array", + "description": "List of record type sections for organizing record types", + "items": { + "$ref": "#/components/schemas/RecordTypeSectionDto" + } + } + } + }, + "V2FieldError": { + "type": "object", + "description": "Field-level error detail used in validation errors and per-item batch failures.", + "properties": { + "field": { + "type": "string", + "description": "Name of the field or path that caused the error.", + "example": "name" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the error for this field.", + "example": "Workspace name can not be blank" + }, + "code": { + "type": "string", + "description": "Machine-readable code identifying the validation rule that failed.", + "example": "NotBlank" + } + } + }, + "V2ProblemDetail": { + "type": "object", + "description": "RFC 7807 Problem Details error response for V2 endpoints.", + "properties": { + "title": { + "type": "string", + "description": "Short, human-readable summary of the error type. Same for all occurrences of the same error.", + "example": "Not found" + }, + "status": { + "type": "integer", + "format": "int32", + "description": "HTTP status code of the response.", + "example": 404 + }, + "detail": { + "type": "string", + "description": "Human-readable, resource-specific explanation of this error occurrence. Always English.", + "example": "Record type with ID 'Rt69b14f7e' was not found." + }, + "errorCode": { + "type": "string", + "description": "Machine-readable error code (enum name).", + "example": "ENTITY_WITH_ATTRIBUTE_NOT_FOUND" + }, + "messageArguments": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Named parameters used to compose the detail message. Values are always strings.", + "example": { + "recordTypeId": "Rt69b14f7e" + } + }, + "requestId": { + "type": "string", + "description": "Request correlation ID for tracing and support.", + "example": "5b1f7a8c-2c0e-4a8f-9c4f-2a3b1c0e4d5f" + }, + "errors": { + "type": "array", + "description": "Field-level or per-item error details. Present for validation, business-rule, or batch failures.", + "items": { + "$ref": "#/components/schemas/V2FieldError" + } + } + }, + "required": [ + "detail", + "errorCode", + "requestId", + "status", + "title" + ] + }, + "Coloring": { + "type": "object", + "properties": { + "record": { + "$ref": "#/components/schemas/RecordColoring" + }, + "group": { + "$ref": "#/components/schemas/GroupColoring" + } + } + }, + "ColumnMetadata": { + "type": "object", + "properties": { + "width": { + "type": "integer", + "format": "int32" + }, + "fieldId": { + "type": "string" + }, + "visibility": { + "type": "boolean" + }, + "aggregationFunction": { + "type": "string", + "enum": [ + "SUM", + "AVG", + "MIN", + "MAX" + ] + } + } + }, + "DynamicFieldMetadataDto": { + "type": "object", + "description": "Dynamic field metadata for global/dynamic record types", + "properties": { + "scopeWorkspaceId": { + "type": "string", + "description": "Workspace ID this view is scoped to", + "example": "Ws69b14f7e0e38f35f28c3ccee" + }, + "dynamicFieldIds": { + "type": "array", + "description": "Field IDs that are workspace-specific (dynamic) in this view", + "items": { + "type": "string" + }, + "uniqueItems": true + } + } + }, + "FilterColoringRule": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "color": { + "type": "string" + }, + "appliedFilters": { + "type": "array", + "items": {} + } + } + }, + "GroupColoring": { + "type": "object", + "properties": { + "selected": { + "type": "string", + "enum": [ + "DEFAULT", + "FIELD" + ] + } + } + }, + "GroupDto": { + "type": "object", + "description": "Grouping specification", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to group by", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "direction": { + "type": "string", + "description": "Sort direction for the grouped values (asc or desc). Defaults to asc if omitted.", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + } + }, + "required": [ + "fieldId" + ] + }, + "RecordColoring": { + "type": "object", + "properties": { + "selected": { + "type": "string", + "enum": [ + "RECORD_TYPE", + "RECORD", + "FIELD", + "GROUP", + "FILTER", + "NONE" + ] + }, + "fieldId": { + "type": "string" + }, + "highlightFullRow": { + "type": "boolean" + }, + "filterColoringRules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterColoringRule" + } + } + } + }, + "SortDto": { + "type": "object", + "description": "Sort specification", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to sort by", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "direction": { + "type": "string", + "description": "Sort direction (asc or desc). Defaults to asc if omitted.", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + } + }, + "required": [ + "fieldId" + ] + }, + "ViewDto": { + "type": "object", + "description": "View data containing all view properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the view. Maximum 255 characters; cannot be blank. Each record type allows up to 100 personal views.", + "example": "My Table View", + "maxLength": 255, + "minLength": 0 + }, + "type": { + "type": "string", + "description": "Type of the view (TABLE, TIMELINE, CALENDAR, LIST, GALLERY)", + "enum": [ + "TABLE", + "TIMELINE", + "CALENDAR", + "LIST", + "GALLERY" + ], + "example": "TABLE", + "minLength": 1 + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this view belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "filter": { + "type": "array", + "description": "Filter conditions applied to records in this view", + "example": [], + "items": { + "$ref": "#/components/schemas/FilterNodeDto" + } + }, + "grouping": { + "type": "array", + "description": "Grouping configuration for records in this view", + "items": { + "$ref": "#/components/schemas/GroupDto" + } + }, + "sorting": { + "type": "array", + "description": "Sorting configuration for records in this view", + "items": { + "$ref": "#/components/schemas/SortDto" + } + }, + "metadata": { + "$ref": "#/components/schemas/ViewMetadataDto", + "description": "View-specific metadata (column widths, date fields, etc.)" + }, + "isHidden": { + "type": "boolean", + "description": "Whether this view is hidden from the view list", + "example": false + }, + "isPublicShared": { + "type": "boolean", + "description": "Whether this view is publicly shared via a link", + "example": false, + "readOnly": true + }, + "isRestricted": { + "type": "boolean", + "description": "Whether this view is restricted (limited access for global/dynamic record types)", + "example": false, + "readOnly": true + } + }, + "required": [ + "name", + "type" + ] + }, + "ViewMetadataDto": { + "type": "object", + "description": "View metadata containing view-type specific configuration", + "properties": { + "type": { + "type": "string", + "description": "Type of the view metadata (should match view type)", + "example": "TABLE" + }, + "showThumbnail": { + "type": "boolean", + "description": "Whether to show thumbnail images in the view", + "example": true + }, + "showRecordColoring": { + "type": "boolean", + "description": "Whether to show record coloring in the view", + "example": false + }, + "columnMetadata": { + "type": "array", + "description": "Column metadata for table views (visibility and width)", + "items": { + "$ref": "#/components/schemas/ColumnMetadata" + } + }, + "newColumnMetadata": { + "type": "array", + "description": "New column metadata for table views (visible fields only)", + "items": { + "$ref": "#/components/schemas/ColumnMetadata" + } + }, + "rowOrder": { + "type": "array", + "description": "Custom row order for table views (deprecated)", + "items": { + "type": "string" + } + }, + "startDateKey": { + "type": "string", + "description": "Field ID of the start date field (required for timeline and calendar views)", + "example": "F69b14f7e0e38f35f28c3ccee" + }, + "endDateKey": { + "type": "string", + "description": "Field ID of the end date field (for timeline and calendar views)", + "example": "F69b14f7e0e38f35f28c3ccef" + }, + "timelineScale": { + "type": "string", + "description": "Timeline scale type for timeline views", + "enum": [ + "YEAR", + "QUARTER", + "MONTH", + "WEEK" + ] + }, + "cardFieldIds": { + "type": "array", + "description": "Field IDs to display on timeline bars or calendar cards", + "items": { + "type": "string" + } + }, + "coloring": { + "$ref": "#/components/schemas/Coloring", + "description": "Coloring configuration for conditional formatting" + }, + "rowHeight": { + "type": "string", + "description": "Row height setting for table and calendar views", + "enum": [ + "SHORT", + "COMPACT", + "MEDIUM", + "TALL", + "FIT_CONTENT" + ] + }, + "truncateRecordContent": { + "type": "boolean", + "description": "Whether to truncate record content in timeline views", + "example": false + }, + "dynamicFieldMetadata": { + "$ref": "#/components/schemas/DynamicFieldMetadataDto", + "description": "Dynamic field metadata for global/dynamic record types" + } + } + }, + "FilterCondition": { + "type": "string", + "description": "Supported filter conditions for record search", + "enum": [ + "CONTAINS", + "DOES_NOT_CONTAIN", + "IS", + "IS_NOT", + "IS_EMPTY", + "IS_NOT_EMPTY", + "GREATER_THAN", + "GREATER_THAN_OR_EQUAL", + "LESS_THAN", + "LESS_THAN_OR_EQUAL", + "IS_AFTER", + "IS_BEFORE", + "IS_BETWEEN", + "IS_NOT_BETWEEN", + "IS_ANY_OF", + "IS_NONE_OF", + "HAS_ANY_OF", + "HAS_ALL_OF", + "HAS_NONE_OF", + "IS_EXACTLY" + ] + }, + "FilterConditionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FilterNodeDto" + }, + { + "type": "object", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to filter on", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "condition": { + "$ref": "#/components/schemas/FilterCondition", + "description": "Filter condition to apply" + }, + "value": { + "description": "Value to compare against. Omit for unary conditions (IS_EMPTY, IS_NOT_EMPTY). Use an array for range conditions (IS_BETWEEN) or multi-value conditions (IS_ANY_OF). For People fields (USER, CREATED_BY, UPDATED_BY, APPROVED_BY), by default plain string values are interpreted as Adobe IMS user IDs when the customer is IMS-migrated; otherwise they are interpreted as Workfront user IDs. To explicitly set the ID type and avoid ambiguity, pass a typed object such as {\"id\":\"63e3b13000078c1795146248182d15dc\",\"idType\":\"WF\"} (use \"idType\":\"IMS\" for Adobe IMS IDs).", + "example": "Active" + }, + "matchExternalId": { + "type": "boolean", + "description": "When true, values for REFERENCE fields are treated as external connection IDs and resolved to internal record IDs before the search executes. Only valid for external REFERENCE fields (isExternal=true)." + } + } + } + ], + "description": "A leaf filter condition applied to a single field", + "required": [ + "condition", + "fieldId" + ] + }, + "FilterGroupDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FilterNodeDto" + }, + { + "type": "object", + "properties": { + "operator": { + "$ref": "#/components/schemas/FilterOperator", + "description": "Logical operator to combine conditions" + }, + "conditions": { + "type": "array", + "description": "List of filter nodes: leaf conditions or nested groups", + "items": { + "$ref": "#/components/schemas/FilterNodeDto" + }, + "minItems": 1 + } + } + } + ], + "description": "A group of filter conditions combined with a logical operator (AND/OR). Supports recursive nesting for complex filter logic.", + "required": [ + "conditions", + "operator" + ] + }, + "FilterNodeDto": { + "description": "A node in the filter tree: either a leaf condition or a nested group", + "oneOf": [ + { + "$ref": "#/components/schemas/FilterConditionDto" + }, + { + "$ref": "#/components/schemas/FilterGroupDto" + } + ] + }, + "FilterOperator": { + "type": "string", + "description": "Logical operator for combining filter conditions", + "enum": [ + "AND", + "OR" + ] + }, + "CoverImageDto": { + "type": "object", + "description": "Cover image information for a record", + "properties": { "url": { + "type": "string", + "description": "URL of the cover image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png" + }, + "position": { + "type": "integer", + "format": "int32", + "description": "Vertical position of the cover image", + "example": 0 + } + } + }, + "RecordBaseDto": { + "type": "object", + "description": "Partial record data to update. Only provided fields will be updated.", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the record", + "example": "Rc69b2a78e63cd0d41a1bedf2e", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this record belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "data": { + "type": "object", + "additionalProperties": {}, + "description": "Field data for the record as key-value pairs where keys are field IDs", + "example": { + "F693ab1c96f11ea3f4175e710": "Campaign Name", + "F693ab1c96f11ea3f4175e711": "2026-03-15" + } + }, + "thumbnailUrl": { + "type": "string", + "description": "URL of the record thumbnail image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png", + "readOnly": true + }, + "coverImage": { + "$ref": "#/components/schemas/CoverImageDto", + "description": "Cover image information for the record", + "readOnly": true + } + } + }, + "RecordDto": { + "type": "object", + "description": "Complete record data including all record properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the record", + "example": "Rc69b2a78e63cd0d41a1bedf2e", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this record belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "data": { + "type": "object", + "additionalProperties": {}, + "description": "Field data for the record as key-value pairs where keys are field IDs", + "example": { + "F693ab1c96f11ea3f4175e710": "Campaign Name", + "F693ab1c96f11ea3f4175e711": "2026-03-15" + } + }, + "thumbnailUrl": { + "type": "string", + "description": "URL of the record thumbnail image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png", + "readOnly": true + }, + "coverImage": { + "$ref": "#/components/schemas/CoverImageDto", + "description": "Cover image information for the record", + "readOnly": true + }, + "recordTypeAlias": { + "type": "string", + "description": "Alias of the record type (only populated when aliased=true)", + "example": "campaigns", + "readOnly": true + } + } + }, + "RecordBulkItemErrorDto": { + "type": "object", + "description": "Per-item error detail in a bulk record operation response.", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable error code.", + "example": "ENTITY_WITH_ATTRIBUTE_NOT_FOUND" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of this specific item failure.", + "example": "Record with ID 'Rc123' was not found." + }, + "details": { + "type": "object", + "additionalProperties": {}, + "description": "Optional structured context for this item failure." + } + } + }, + "RecordBulkRequestErrorDto": { + "type": "object", + "description": "Request-level error affecting multiple items in a bulk operation.", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable error code.", + "example": "RATE_LIMIT_EXCEEDED" + }, + "message": { + "type": "string", + "description": "Human-readable description of the request-level error.", + "example": "Bulk operation limit of 100 items per request exceeded; 58 items were skipped" + }, + "affectedIds": { + "type": "array", + "description": "IDs of the items affected by this request-level error.", + "items": { + "type": "string" + } + } + } + }, + "RecordBulkResponseDto": { + "type": "object", + "description": "Response envelope for V2 bulk record operations.", + "properties": { + "status": { + "type": "string", + "description": "Overall bulk operation status.", + "enum": [ + "success", + "partial", + "failed" + ] + }, + "total": { + "type": "integer", + "format": "int32", + "description": "Number of input items submitted.", + "example": 10 + }, + "succeeded": { + "type": "integer", + "format": "int32", + "description": "Number of successful item results.", + "example": 3 + }, + "failed": { + "type": "integer", + "format": "int32", + "description": "Number of failed item results.", + "example": 7 + }, + "requestId": { + "type": "string", + "description": "Request correlation ID for tracing and support.", + "example": "5b1f7a8c-2c0e-4a8f-9c4f-2a3b1c0e4d5f" + }, + "errors": { + "type": "array", + "description": "Request-level errors affecting multiple items.", + "items": { + "$ref": "#/components/schemas/RecordBulkRequestErrorDto" + } + }, + "results": { + "type": "array", + "description": "Per-item results in the same order as the input.", + "items": { + "$ref": "#/components/schemas/RecordBulkResultItemDtoObject" + } + } + } + }, + "RecordBulkResultItemDtoObject": { + "type": "object", + "description": "Result for one input item in a bulk record operation.", + "properties": { + "requestIndex": { + "type": "integer", + "format": "int32", + "description": "Zero-based index of the input item.", + "example": 0 + }, + "id": { + "type": "string", + "description": "Record ID for this item when available.", + "example": "Rc69b2a78e63cd0d41a1bedf2e" + }, + "status": { + "type": "string", + "description": "Per-item operation status.", + "enum": [ + "success", + "error" + ] + }, + "error": { + "$ref": "#/components/schemas/RecordBulkItemErrorDto", + "description": "Error payload. Present only when status is error." + }, + "record": { + "$ref": "#/components/schemas/RecordDto", + "description": "Record payload. Present on successful create, update, and patch items." + } + } + }, + "AuthzSubjectDtoV2": { + "type": "object", + "description": "Authorization subject reference (user, group, team, etc.)", + "properties": { + "type": { + "type": "string", + "description": "Type of the authorization subject", + "enum": [ + "maestro/workspace", + "maestro/public_workspace", + "maestro/recordtype", + "maestro/record", + "redrock/user", + "redrock/group", + "redrock/cmpy", + "redrock/cust", + "redrock/teamob", + "redrock/role", + "ims/user", + "member", + "groupmember", + "maestro/view", + "maestro/dynamic_recordtype" + ], + "example": "redrock/user" + }, + "id": { + "type": "string", + "description": "ID of the authorization subject", + "example": "U123abc" + } + } + }, + "RecordTypeDto": { + "type": "object", + "description": "Complete record type data including linkability settings and external options", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the record type", + "example": "campaigns", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the record type. Maximum 255 characters; cannot be blank.", + "example": "Campaigns", + "maxLength": 255, + "minLength": 0 + }, + "description": { + "type": "string", + "description": "Description of the record type purpose. Maximum 1024 characters.", + "example": "Marketing campaigns and promotional activities", + "maxLength": 1024, + "minLength": 0 + }, + "primaryFieldId": { + "type": "string", + "description": "ID of the primary field for this record type", + "example": "F693ab1c96f11ea3f4175e716" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the record type", + "example": "diamond" + }, + "color": { + "type": "string", + "description": "Color theme for the record type", + "example": "purple" + }, + "isExternal": { + "type": "boolean", + "description": "Indicates if this is an external record type", + "example": false + }, + "sourceRecordTypeId": { + "type": "string", + "description": "ID of an existing global record type to attach to the workspace (used only on create). When provided, the record type is not created but attached as a dynamic usage.", + "example": "Rt69b14f7e0e38f35f28c3ccee", + "writeOnly": true + }, + "externalOptions": { + "$ref": "#/components/schemas/RecordTypeExternalOptionsDto", + "description": "External options for external record types" + }, + "linkableWithAllWorkspaces": { + "type": "boolean", + "description": "Indicates if this record type can be linked with all workspaces", + "example": false + }, + "linkableWithWorkspaceIds": { + "type": "array", + "description": "List of workspace IDs that this record type can be linked with", + "items": { + "type": "string" + } + }, + "globalRecordTypeWorkspaceFieldId": { + "type": "string", + "description": "ID of the global record type workspace field", + "example": "F693ab1c96f11ea3f4175e717", + "readOnly": true + }, + "isGlobal": { + "type": "boolean", + "description": "Indicates if this is a global record type", + "example": false, + "readOnly": true + }, + "authorizedToCreateDynamicRecordType": { + "type": "array", + "description": "List of subjects authorized to create dynamic record types from this global record type", + "items": { + "$ref": "#/components/schemas/AuthzSubjectDtoV2" + } + }, + "primaryWorkspaceId": { + "type": "string", + "description": "ID of the workspace where this global record type was originally created", + "example": "Ws69b14f7e0e38f35f28c3ccee", + "readOnly": true + }, + "dynamicWorkspaceIds": { + "type": "array", + "description": "List of workspace IDs that use this global record type dynamically", + "items": { + "type": "string" + }, + "readOnly": true + } + }, + "required": [ + "displayName" + ] + }, + "RecordTypeExternalOptionsDto": { + "type": "object", + "description": "External options for external record types", + "properties": { + "connection": { + "type": "string", + "description": "External connection type", + "enum": [ + "WORKFRONT", + "BRAND", + "AEM", + "INTAKE" + ], + "example": "WORKFRONT" + }, + "object": { + "type": "string", + "description": "External object type", + "enum": [ + "PROJECT", + "PORTFOLIO", + "PROGRAM", + "COMPANY", + "GROUP", + "TEMPLATE", + "ASSET", + "BRAND", + "ORIGINAL_REQUEST" + ], + "example": "PROJECT" + }, + "fields": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Field mappings between external and internal fields" + } + } + }, + "FieldAttachmentOptionsDto": { + "type": "object", + "description": "Attachment field options", + "properties": { + "showThumbnail": { + "type": "boolean", + "description": "Whether to display attachment thumbnails" + }, + "showTitle": { + "type": "boolean", + "description": "Whether to display attachment titles" + } + } + }, + "FieldDateOptions": { + "type": "object", + "properties": { + "dateFormat": { + "type": "string", + "enum": [ + "locale", + "standard", + "friendly", + "european", + "iso" + ] + }, + "timeFormat": { + "type": "string", + "enum": [ + "h12", + "h24" + ] + }, + "useSameTimezoneForAllCollaborators": { + "type": "boolean" + }, + "timezoneId": { "type": "string" + } + } + }, + "FieldDateOptionsDto": { + "type": "object", + "description": "Date field options", + "properties": { + "dateFormat": { + "type": "string", + "description": "Date format", + "enum": [ + "locale", + "standard", + "friendly", + "european", + "iso" + ] + }, + "timeFormat": { + "type": "string", + "description": "Time format", + "enum": [ + "h12", + "h24" + ] + } + } + }, + "FieldDto": { + "type": "object", + "description": "Field data for record types", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the field", + "example": "F693ab1c96f11ea3f4175e716", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the field", + "example": "campaign_name", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the field. Maximum 256 characters; must be unique within the parent record type.", + "example": "Campaign Name", + "maxLength": 256, + "minLength": 0 + }, + "type": { + "type": "string", + "description": "Type of the field. Subject to per-record-type quotas: max 20 PARAGRAPH (long text), max 20 FORMULA, max 30 REFERENCE.", + "enum": [ + "TEXT", + "PARAGRAPH", + "NUMBER", + "PERCENTAGE", + "CURRENCY", + "DATE", + "SINGLE_SELECT", + "MULTI_SELECT", + "CHECKBOX", + "REFERENCE", + "USER", + "FORMULA" + ], + "example": "TEXT" + }, + "description": { + "type": "string", + "description": "Description of the field. Maximum 512 characters.", + "example": "Name of the marketing campaign", + "maxLength": 512, + "minLength": 0 + }, + "linkedField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Linked field for reference and lookup fields" + }, + "options": { + "type": "array", + "description": "Field options for single-select and multi-select fields", + "items": { + "$ref": "#/components/schemas/FieldOptionDto" + } + }, + "defaultOptions": { + "type": "array", + "description": "Default options for single-select and multi-select fields", + "items": { + "type": "string" + } + }, + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptionsDto", + "description": "Date field options" + }, + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptionsDto", + "description": "Number field options for number, percentage, and currency fields" + }, + "referenceOptions": { + "$ref": "#/components/schemas/FieldReferenceOptionsDto", + "description": "Reference field options" + }, + "lookupOptions": { + "$ref": "#/components/schemas/FieldLookupOptionsDto", + "description": "Lookup field options" + }, + "formulaOptions": { + "$ref": "#/components/schemas/FieldFormulaOptionsDto", + "description": "Formula field options" + }, + "userOptions": { + "$ref": "#/components/schemas/FieldUserOptionsDto", + "description": "User field options" + }, + "defaultUsers": { + "type": "array", + "description": "Default user option", + "items": { + "type": "string" + } + }, + "attachmentOptions": { + "$ref": "#/components/schemas/FieldAttachmentOptionsDto", + "description": "Attachment field options" + }, + "hasError": { + "type": "boolean", + "description": "Indicates if the field has an error" + }, + "isHtmlNative": { + "type": "boolean", + "description": "Indicates if the long text field is HTML native" + }, + "metadata": { + "$ref": "#/components/schemas/FieldMetadataDto", + "description": "Field metadata" + } + } + }, + "FieldFormulaOptionsDto": { + "type": "object", + "description": "Formula field options", + "properties": { + "formula": { + "type": "string", + "description": "Formula expression" + }, + "returnType": { + "type": "string", + "description": "Return type of the formula", + "enum": [ + "DATE", + "DATETIME", + "NUMBER", + "PERCENTAGE", + "CURRENCY", + "TEXT", + "TEXT_ARRAY" + ] + }, + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptions", + "description": "Number options for number-type formulas" + }, + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptions", + "description": "Date options for date-type formulas" + } + } + }, + "FieldLookupOptionsDto": { + "type": "object", + "description": "Lookup field options", + "properties": { + "referenceFieldId": { + "type": "string", + "description": "Reference field ID" + }, + "rollup": { + "type": "string", + "description": "Rollup function (e.g., SUM, AVG, COUNT)" + }, + "sourceField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Source field being looked up" + } + } + }, + "FieldMetadataDto": { + "type": "object", + "description": "Field metadata", + "properties": { + "originType": { + "type": "string", + "description": "Origin type of the field" + }, + "extendedRollup": { + "type": "string", + "description": "Extended rollup information" + } + } + }, + "FieldNumberOptions": { + "type": "object", + "properties": { + "precision": { + "type": "integer", + "format": "int32" + }, + "allowNegatives": { + "type": "boolean" + }, + "currency": { + "type": "string", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "AON", + "ARS", + "AUD", + "AZN", + "BAM", + "BBD", + "BDT", + "BGL", + "BHD", + "BIF", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUP", + "CVE", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "GBP", + "GEL", + "GHC", + "GMD", + "GNF", + "GTQ", + "GYD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MRU", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZM", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SLL", + "SOS", + "SRD", + "SSP", + "STN", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TZS", + "UAH", + "UGS", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XOF", + "YER", + "ZAR", + "ZMK", + "ZWD" + ] + }, + "visualizationType": { + "type": "string", + "enum": [ + "TEXT", + "PROGRESS_BAR", + "PROGRESS_CIRCLE" + ] + } + } + }, + "FieldNumberOptionsDto": { + "type": "object", + "description": "Number field options for number, percentage, and currency fields", + "properties": { + "precision": { + "type": "integer", + "format": "int32", + "description": "Decimal places (0-4)" + }, + "allowNegatives": { + "type": "boolean", + "description": "Whether negative values are allowed" + }, + "currency": { + "type": "string", + "description": "Currency code (e.g. USD, EUR, GBP); only for currency fields", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "AON", + "ARS", + "AUD", + "AZN", + "BAM", + "BBD", + "BDT", + "BGL", + "BHD", + "BIF", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUP", + "CVE", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "GBP", + "GEL", + "GHC", + "GMD", + "GNF", + "GTQ", + "GYD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MRU", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZM", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SLL", + "SOS", + "SRD", + "SSP", + "STN", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TZS", + "UAH", + "UGS", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XOF", + "YER", + "ZAR", + "ZMK", + "ZWD" + ] }, - "position": { - "type": "integer", - "format": "int32" + "visualizationType": { + "type": "string", + "description": "Display format: TEXT (default), PROGRESS_BAR, or PROGRESS_CIRCLE", + "enum": [ + "TEXT", + "PROGRESS_BAR", + "PROGRESS_CIRCLE" + ] } - }, - "readOnly": true + } }, - "RecordDto": { + "FieldOptionDto": { "type": "object", + "description": "Field option for single-select and multi-select fields", "properties": { - "id": { - "type": "string" + "name": { + "description": "Name identifier for the option" }, - "createdBy": { - "type": "string" + "displayName": { + "type": "string", + "description": "Display name for the option" }, - "createdAt": { - "type": "string" + "color": { + "type": "string", + "description": "Color code for the option" }, - "updatedBy": { - "type": "string" + "groupId": { + "type": "string", + "description": "Group ID for grouped options" + } + } + }, + "FieldReferenceExternalOptionsDto": { + "type": "object", + "description": "External reference options for external connections", + "properties": { + "connectionName": { + "type": "string", + "description": "Connection name" }, - "updatedAt": { - "type": "string" + "objectName": { + "type": "string", + "description": "Object name in the external system" }, - "customerId": { - "type": "string" + "connectionOptions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Connection-specific options" + } + } + }, + "FieldReferenceLookupFieldDto": { + "type": "object", + "description": "Lookup field configuration for reference fields", + "properties": { + "fieldId": { + "type": "string", + "description": "Field ID to auto-create as a lookup from the linked record type" }, - "imsOrgId": { - "type": "string" + "rollup": { + "type": "string", + "description": "Optional aggregation function: sum, avg, min, max, or dist" + } + } + }, + "FieldReferenceOptionsDto": { + "type": "object", + "description": "Reference field options", + "properties": { + "multiple": { + "type": "boolean", + "description": "Whether multiple records can be selected" + }, + "showThumbnail": { + "type": "boolean", + "description": "Whether to show thumbnail" + }, + "showTitle": { + "type": "boolean", + "description": "Whether to show title" + }, + "showColor": { + "type": "boolean", + "description": "Whether to show color" }, "recordTypeId": { - "type": "string" + "type": "string", + "description": "Referenced record type ID" }, - "data": { + "isExternal": { + "type": "boolean", + "description": "Whether the reference is external" + }, + "createBackReference": { + "type": "boolean", + "description": "Whether to create a back reference" + }, + "backField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Back reference field" + }, + "externalOptions": { + "$ref": "#/components/schemas/FieldReferenceExternalOptionsDto", + "description": "External options for external references" + }, + "filters": { "type": "object", - "additionalProperties": { - "type": "object" + "additionalProperties": {}, + "description": "Filters for the reference field" + }, + "lookupFields": { + "type": "array", + "description": "Lookup fields for the reference", + "items": { + "$ref": "#/components/schemas/FieldReferenceLookupFieldDto" } }, - "recordExternalOptions": { - "$ref": "#/components/schemas/RecordExternalOptions" + "scopeWorkspaceIds": { + "type": "array", + "description": "Scope workspace IDs for global record types", + "items": { + "type": "string" + } }, - "thumbnailUrl": { + "globalRecordTypeWorkspaceFieldId": { "type": "string", - "readOnly": true - }, - "coverImage": { - "$ref": "#/components/schemas/CoverImage" + "description": "Global record type workspace field ID" } } }, - "RecordExternalOptions": { + "FieldUserOptionsDto": { "type": "object", + "description": "User field options", "properties": { - "connection": { + "multipleUsersAllowed": { + "type": "boolean", + "description": "Whether multiple users can be selected" + } + } + }, + "RecordTypeBaseDto": { + "type": "object", + "description": "Base record type data containing common record type properties", + "properties": { + "id": { "type": "string", - "enum": [ - "WORKFRONT", - "AEM" - ] + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true }, - "object": { + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { "type": "string", - "enum": [ - "PROJECT", - "PORTFOLIO", - "PROGRAM", - "COMPANY", - "GROUP", - "ASSET" - ] + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true }, - "externalId": { - "type": "string" + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true }, - "connectionOptions": { - "type": "object", - "additionalProperties": { - "type": "object" - } + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true }, - "link": { - "type": "string" + "alias": { + "type": "string", + "description": "Unique alias identifier for the record type", + "example": "campaigns", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the record type. Maximum 255 characters; cannot be blank.", + "example": "Campaigns", + "maxLength": 255, + "minLength": 0 + }, + "description": { + "type": "string", + "description": "Description of the record type purpose. Maximum 1024 characters.", + "example": "Marketing campaigns and promotional activities", + "maxLength": 1024, + "minLength": 0 + }, + "primaryFieldId": { + "type": "string", + "description": "ID of the primary field for this record type", + "example": "F693ab1c96f11ea3f4175e716" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the record type", + "example": "diamond" + }, + "color": { + "type": "string", + "description": "Color theme for the record type", + "example": "purple" + }, + "isExternal": { + "type": "boolean", + "description": "Indicates if this is an external record type", + "example": false + }, + "sourceRecordTypeId": { + "type": "string", + "description": "ID of an existing global record type to attach to the workspace (used only on create). When provided, the record type is not created but attached as a dynamic usage.", + "example": "Rt69b14f7e0e38f35f28c3ccee", + "writeOnly": true } - } - }, - "JsonNode": { - "type": "object" + }, + "required": [ + "displayName" + ] }, - "RecordSearchDto": { + "RecordSearchRequestDto": { "type": "object", + "description": "Search criteria including filters, sorting, and grouping", "properties": { "recordTypeId": { - "type": "string" + "type": "string", + "description": "ID of the record type to search within", + "example": "Rt69b14f7e0e38f35f28c3ccee" }, "recordTypeAlias": { - "type": "string" + "type": "string", + "description": "Alias of the record type to search within", + "example": "campaigns" }, - "filters": { - "$ref": "#/components/schemas/JsonNode" + "filter": { + "$ref": "#/components/schemas/FilterGroupDto", + "description": "Filter criteria using the composite filter pattern. Supports recursive AND/OR nesting with strongly-typed conditions." + }, + "sort": { + "type": "array", + "description": "Sorting configuration for records", + "items": { + "$ref": "#/components/schemas/SortDto" + } + }, + "group": { + "type": "array", + "description": "Grouping configuration for records", + "items": { + "$ref": "#/components/schemas/GroupDto" + } }, - "groupingFieldIds": { + "scopeWorkspaceIds": { "type": "array", + "description": "List of workspace IDs to scope the search to (for global record types)", + "example": [ + "Ws123", + "Ws456" + ], "items": { "type": "string" } }, - "sorting": { + "globalRecordTypeWorkspaceFieldId": { + "type": "string", + "description": "ID of the global record type workspace field (for global record types)", + "example": "F693ab1c96f11ea3f4175e717" + } + } + }, + "PageRecordDto": { + "type": "object", + "properties": { + "totalPages": { + "type": "integer", + "format": "int32" + }, + "totalElements": { + "type": "integer", + "format": "int64" + }, + "first": { + "type": "boolean" + }, + "last": { + "type": "boolean" + }, + "size": { + "type": "integer", + "format": "int32" + }, + "content": { "type": "array", "items": { - "$ref": "#/components/schemas/RecordSorting" + "$ref": "#/components/schemas/RecordDto" } }, - "offset": { + "number": { "type": "integer", "format": "int32" }, - "limit": { + "sort": { + "$ref": "#/components/schemas/SortObject" + }, + "pageable": { + "$ref": "#/components/schemas/PageableObject" + }, + "numberOfElements": { "type": "integer", "format": "int32" }, - "rowOrderViewId": { - "type": "string" + "empty": { + "type": "boolean" } } }, - "RecordSorting": { + "PageableObject": { "type": "object", "properties": { - "fieldId": { - "type": "string" + "offset": { + "type": "integer", + "format": "int64" }, - "direction": { - "type": "string", - "enum": [ - "asc", - "desc" - ] - } - } - }, - "GroupedRecordsDto": { - "type": "object", - "properties": { - "records": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RecordDto" - } + "sort": { + "$ref": "#/components/schemas/SortObject" }, - "groups": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RecordGroupDto" - } + "unpaged": { + "type": "boolean" + }, + "paged": { + "type": "boolean" }, - "totalCount": { + "pageNumber": { + "type": "integer", + "format": "int32" + }, + "pageSize": { "type": "integer", "format": "int32" } @@ -730,553 +6777,552 @@ }, "RecordGroupDto": { "type": "object", + "description": "Group of records with common field values", "properties": { "fieldId": { - "type": "string" + "type": "string", + "description": "ID of the field used for grouping", + "example": "F693ab1c96f11ea3f4175e716" }, "value": { - "type": "object" + "description": "Value of the grouping field", + "example": "Active" }, "recordIds": { "type": "array", + "description": "List of record IDs in this group", + "example": [ + "R123", + "R456", + "R789" + ], "items": { "type": "string" } + }, + "count": { + "type": "integer", + "format": "int32", + "description": "Count of records in this group", + "example": 3 } } }, - "FieldDateOptionsDto": { + "RecordSearchPageDto": { "type": "object", + "description": "Paginated search response containing records and groups", "properties": { - "dateFormat": { - "type": "string", - "enum": [ - "locale", - "standard", - "friendly", - "european", - "iso" - ] + "records": { + "$ref": "#/components/schemas/PageRecordDto", + "description": "Paginated records matching the search criteria" }, - "timeFormat": { - "type": "string", - "enum": [ - "h12", - "h24" - ] + "groups": { + "type": "array", + "description": "List of record groups (if grouping was requested)", + "items": { + "$ref": "#/components/schemas/RecordGroupDto" + } } } }, - "FieldDto": { + "SortObject": { "type": "object", "properties": { - "id": { - "type": "string" - }, - "createdBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "customerId": { - "type": "string" - }, - "imsOrgId": { - "type": "string" - }, - "alias": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "type": { - "type": "string" - }, - "linkedField": { - "$ref": "#/components/schemas/FieldDto" - }, - "description": { - "type": "string" - }, - "options": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FieldOptionDto" - } - }, - "dateOptions": { - "$ref": "#/components/schemas/FieldDateOptionsDto" - }, - "numberOptions": { - "$ref": "#/components/schemas/FieldNumberOptionsDto" - }, - "referenceOptions": { - "$ref": "#/components/schemas/FieldReferenceOptionsDto" - }, - "lookupOptions": { - "$ref": "#/components/schemas/FieldLookupOptionsDto" - }, - "formulaOptions": { - "$ref": "#/components/schemas/FieldFormulaOptionsDto" + "empty": { + "type": "boolean" }, - "userOptions": { - "$ref": "#/components/schemas/FieldUserOptionsDto" + "sorted": { + "type": "boolean" }, - "hasError": { + "unsorted": { "type": "boolean" } } }, - "FieldFormulaOptionsDto": { + "MoveRecordsRequestDto": { "type": "object", + "description": "Move request specifying which records to move and where", "properties": { - "formula": { - "type": "string" + "recordIds": { + "type": "array", + "description": "IDs of the records to move, in the order they should appear at the destination.", + "example": [ + "Rc6796...01", + "Rc6796...02" + ], + "items": { + "type": "string", + "minLength": 1 + }, + "maxItems": 100, + "minItems": 0 + }, + "putAfterRecordId": { + "type": "string", + "description": "Place the moved records immediately AFTER this record. Mutually exclusive with putBeforeRecordId.", + "example": "Rc67a1..." + }, + "putBeforeRecordId": { + "type": "string", + "description": "Place the moved records immediately BEFORE this record. Mutually exclusive with putAfterRecordId.", + "example": "Rc67a2..." } - } + }, + "required": [ + "recordIds" + ] }, - "FieldLookupOptionsDto": { + "CreateAccessRequestDto": { "type": "object", + "description": "Request body for creating an access request", "properties": { - "referenceFieldId": { - "type": "string" - }, - "rollup": { - "type": "string" - }, - "sourceField": { - "$ref": "#/components/schemas/FieldDto" + "message": { + "type": "string", + "description": "Optional message to include with the access request", + "maxLength": 2000, + "minLength": 0 } } }, - "FieldNumberOptionsDto": { + "MemberGrantDto": { "type": "object", + "description": "A subject and role to grant or update on a resource", "properties": { - "precision": { - "type": "integer", - "format": "int32" + "subjectId": { + "type": "string", + "description": "ID of the user, group, team, role, or company", + "minLength": 1 }, - "allowNegatives": { - "type": "boolean" + "subjectType": { + "type": "string", + "description": "Type of the subject", + "enum": [ + "user", + "group", + "team", + "role", + "company" + ] }, - "currency": { + "role": { "type": "string", + "description": "Role to assign to the subject", "enum": [ - "AED", - "AFN", - "ALL", - "AMD", - "AON", - "ARS", - "AUD", - "AZN", - "BAM", - "BBD", - "BDT", - "BGL", - "BHD", - "BIF", - "BND", - "BOB", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BZD", - "CAD", - "CDF", - "CHF", - "CLP", - "CNY", - "COP", - "CRC", - "CUP", - "CVE", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ERN", - "ETB", - "EUR", - "FJD", - "GBP", - "GEL", - "GHC", - "GMD", - "GNF", - "GTQ", - "GYD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MRU", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZM", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SLL", - "SOS", - "SRD", - "SSP", - "STN", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TZS", - "UAH", - "UGS", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XCD", - "XOF", - "YER", - "ZAR", - "ZMK", - "ZWD" + "viewer", + "editor", + "manager" ] } - } + }, + "required": [ + "role", + "subjectId", + "subjectType" + ] }, - "FieldOptionDto": { + "MemberRevokeDto": { "type": "object", + "description": "A subject to revoke permissions from", "properties": { - "name": { - "type": "string" - }, - "displayName": { - "type": "string" + "subjectId": { + "type": "string", + "description": "ID of the subject to revoke access from", + "minLength": 1 }, - "color": { - "type": "string" + "subjectType": { + "type": "string", + "description": "Type of the subject", + "enum": [ + "user", + "group", + "team", + "role", + "company" + ] } - } + }, + "required": [ + "subjectId", + "subjectType" + ] }, - "FieldReferenceExternalOptionsDto": { + "UpdateMembersRequestDto": { "type": "object", + "description": "Bulk grant, update, and revoke operations for resource members", "properties": { - "connectionName": { - "type": "string" + "grant": { + "type": "array", + "description": "Members to grant new access to", + "items": { + "$ref": "#/components/schemas/MemberGrantDto" + } }, - "objectName": { - "type": "string" + "update": { + "type": "array", + "description": "Members whose existing role should be changed", + "items": { + "$ref": "#/components/schemas/MemberGrantDto" + } }, - "connectionOptions": { - "type": "object", - "additionalProperties": { - "type": "string" + "revoke": { + "type": "array", + "description": "Members to revoke all access from", + "items": { + "$ref": "#/components/schemas/MemberRevokeDto" } + }, + "inheritViewOnly": { + "type": "boolean", + "description": "Set inheritance for a record-type (true=inherited, false=view-only). Only valid for record-types." + }, + "wildcard": { + "type": "string", + "description": "Set wildcard access mode for a record. Only valid for records.", + "enum": [ + "SELECTED_USERS_ONLY", + "EVERYONE_IN_WORKSPACE" + ] } } }, - "FieldReferenceLookupFieldDto": { + "CursorInfo": { "type": "object", + "description": "Cursor pagination metadata", "properties": { - "fieldId": { - "type": "string" + "nextCursor": { + "type": "string", + "description": "Opaque cursor for fetching the next page. Absent when there are no more pages.", + "example": "UnQ2OWIxNGY3ZTBlMzhmMzVmMjhjM2NjZWU=" }, - "rollup": { - "type": "string" + "hasMore": { + "type": "boolean", + "description": "Whether more items exist beyond this page" } } }, - "FieldReferenceOptionsDto": { + "CursorResponseWorkspaceDto": { "type": "object", + "description": "Cursor-paginated list of workspaces", "properties": { - "multiple": { - "type": "boolean" - }, - "recordTypeId": { - "type": "string" - }, - "isExternal": { - "type": "boolean" - }, - "externalOptions": { - "$ref": "#/components/schemas/FieldReferenceExternalOptionsDto" - }, - "filters": { - "type": "object", - "additionalProperties": { - "type": "object" + "content": { + "type": "array", + "description": "List of workspaces in the current page", + "items": { + "$ref": "#/components/schemas/WorkspaceBaseDto" } }, - "lookupFields": { + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "CursorResponseRecordTypeDto": { + "type": "object", + "description": "Cursor-paginated list of record types", + "properties": { + "content": { "type": "array", + "description": "List of record types in the current page", "items": { - "$ref": "#/components/schemas/FieldReferenceLookupFieldDto" + "$ref": "#/components/schemas/RecordTypeBaseDto" } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" } } }, - "FieldUserOptionsDto": { + "CellValueDto": { "type": "object", + "description": "A snapshot of a field value at a point in time", "properties": { - "multipleUsersAllowed": { - "type": "boolean" + "value": { + "description": "The stored value of the field at the time of the change" + }, + "fieldSnapshot": { + "$ref": "#/components/schemas/FieldSnapshotDto", + "description": "Snapshot of the field metadata at the time of the change" } } }, - "RecordTypeDto": { + "CursorResponseHistoryEntryDto": { + "type": "object", + "description": "Cursor-paginated list of history entries", + "properties": { + "content": { + "type": "array", + "description": "List of history entries in the current page", + "items": { + "$ref": "#/components/schemas/HistoryEntryDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "FieldSnapshotDto": { "type": "object", + "description": "Snapshot of field metadata captured at the time of the change", "properties": { "id": { - "type": "string" + "type": "string", + "description": "ID of the field" }, - "createdBy": { - "type": "string" + "type": { + "type": "string", + "description": "Type of the field" }, - "createdAt": { - "type": "string" + "displayName": { + "type": "string", + "description": "Display name of the field" }, - "updatedBy": { - "type": "string" + "description": { + "type": "string", + "description": "Description of the field" }, - "updatedAt": { - "type": "string" + "hasError": { + "type": "boolean", + "description": "Whether the field has a configuration error" }, - "customerId": { - "type": "string" + "options": { + "type": "array", + "description": "Options for single-select or multi-select fields", + "items": { + "$ref": "#/components/schemas/FieldOptionDto" + } }, - "imsOrgId": { - "type": "string" + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptionsDto", + "description": "Date-specific configuration options" }, - "alias": { - "type": "string" + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptionsDto", + "description": "Number-specific configuration options" }, - "displayName": { - "type": "string" + "userOptions": { + "$ref": "#/components/schemas/FieldUserOptionsDto", + "description": "User-specific configuration options" + } + } + }, + "HistoryEntryDto": { + "type": "object", + "description": "A single record field change event", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of this history entry" }, - "permission": { + "recordId": { "type": "string", - "enum": [ - "manage", - "edit", - "view", - "none" - ] + "description": "ID of the record this change belongs to" }, - "primaryFieldId": { - "type": "string" + "createdBy": { + "type": "string", + "description": "ID of the user who made the change" }, - "icon": { - "type": "string" + "createdAt": { + "type": "string", + "description": "ISO-8601 timestamp of when the change occurred", + "example": "2026-01-15T10:30:00.000Z" }, - "description": { - "type": "string" + "fieldId": { + "type": "string", + "description": "ID of the field that changed" }, - "color": { - "type": "string" + "before": { + "$ref": "#/components/schemas/CellValueDto", + "description": "Field state before the change" }, - "fields": { + "after": { + "$ref": "#/components/schemas/CellValueDto", + "description": "Field state after the change" + } + } + }, + "CursorResponseViewDto": { + "type": "object", + "description": "Cursor-paginated list of views", + "properties": { + "content": { "type": "array", + "description": "List of views in the current page", "items": { - "$ref": "#/components/schemas/FieldDto" + "$ref": "#/components/schemas/ViewDto" } }, - "isExternal": { - "type": "boolean" - }, - "externalOptions": { - "$ref": "#/components/schemas/RecordTypeExternalOptionsDto" + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" } } }, - "RecordTypeExternalOptionsDto": { + "CursorResponseFieldDto": { "type": "object", + "description": "Cursor-paginated list of fields", "properties": { - "connectionName": { - "type": "string" - }, - "objectName": { - "type": "string" - }, - "fields": { - "type": "object", - "additionalProperties": { - "type": "string" + "content": { + "type": "array", + "description": "List of fields in the current page", + "items": { + "$ref": "#/components/schemas/FieldDto" } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" } } }, - "RecordTypeSectionDto": { + "PermissionDto": { "type": "object", + "description": "Current user's effective permissions on a resource", "properties": { - "name": { - "type": "string" + "canView": { + "type": "boolean", + "description": "Whether the user can view this resource" }, - "displayName": { - "type": "string" + "canEdit": { + "type": "boolean", + "description": "Whether the user can edit this resource" }, - "recordTypeIds": { - "type": "array", - "items": { - "type": "string" - } + "canDelete": { + "type": "boolean", + "description": "Whether the user can delete this resource" + }, + "canAdd": { + "type": "boolean", + "description": "Whether the user can add items to this resource" } } }, - "WorkspaceDto": { + "AccessRequestDto": { "type": "object", + "description": "A pending access request for a resource", "properties": { "id": { - "type": "string" - }, - "createdBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "customerId": { - "type": "string" + "type": "string", + "description": "Unique identifier of the access request" }, - "imsOrgId": { - "type": "string" + "message": { + "type": "string", + "description": "Optional message from the requester" }, - "alias": { - "type": "string" + "requester": { + "$ref": "#/components/schemas/RequesterDto", + "description": "User who submitted the request" + } + } + }, + "RequesterDto": { + "type": "object", + "description": "The user who submitted an access request", + "properties": { + "id": { + "type": "string", + "description": "User's external identifier" }, "name": { - "type": "string" - }, - "description": { - "type": "string" + "type": "string", + "description": "User's display name" }, - "color": { - "type": "string" + "email": { + "type": "string", + "description": "User's email address" + } + } + }, + "MemberPermissionDto": { + "type": "object", + "description": "A subject (user, group, team, role, or company) with a role on a resource", + "properties": { + "subjectId": { + "type": "string", + "description": "ID of the subject" }, - "permission": { + "subjectType": { "type": "string", + "description": "Type of the subject", "enum": [ - "manage", - "edit", - "view", - "none" + "user", + "group", + "team", + "role", + "company" ] }, - "icon": { - "type": "string" + "name": { + "type": "string", + "description": "Display name of the subject" }, - "recordTypes": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RecordTypeDto" - } + "avatarUrl": { + "type": "string", + "description": "Avatar URL of the subject, if available" }, - "recordTypeSections": { + "role": { + "type": "string", + "description": "Role of the subject on this resource", + "enum": [ + "viewer", + "editor", + "manager" + ] + } + } + }, + "InheritanceDto": { + "type": "object", + "description": "Workspace-member inheritance setting for a record type", + "properties": { + "inherited": { + "type": "boolean", + "description": "When true, workspace members inherit their workspace-level access on this record type. When false, workspace members are restricted to view-only." + } + } + }, + "BulkDeleteRequestDto": { + "type": "object", + "description": "List of record IDs to delete", + "properties": { + "ids": { "type": "array", + "description": "List of record IDs to delete (max 100)", + "example": [ + "r1", + "r2" + ], "items": { - "$ref": "#/components/schemas/RecordTypeSectionDto" - } + "type": "string" + }, + "maxItems": 100, + "minItems": 0 } - } + }, + "required": [ + "ids" + ] }, - "WorkspaceListDto": { + "DeleteAccessRequestsDto": { "type": "object", + "description": "Request body for dismissing access requests", "properties": { - "workspaces": { + "requestIds": { "type": "array", + "description": "IDs of access requests to dismiss", "items": { - "$ref": "#/components/schemas/WorkspaceDto" - } - }, - "permission": { - "type": "string", - "enum": [ - "manage", - "edit", - "view", - "none" - ] + "type": "string" + }, + "minItems": 1 } - } + }, + "required": [ + "requestIds" + ] } } } -} +} \ No newline at end of file diff --git a/static/v2.json b/static/v2.json new file mode 100644 index 0000000..d1fb3cd --- /dev/null +++ b/static/v2.json @@ -0,0 +1,7328 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Workfront Planning API", + "description": "This is WF Planning Service API documentation. WF Planning Service is responsible for creating and managing new workspace, field, record, record type objects across the Workfront application and Adobe DX infrastructure.", + "version": "v2" + }, + "servers": [ + { + "url": "https://{customer-domain}/maestro/api", + "description": "Workfront Planning Service Url" + } + ], + "tags": [ + { + "name": "Workspaces", + "description": "Workspace management. Limits: max 100,000 workspaces per tenant; max 256 characters for workspace name." + }, + { + "name": "Record Types", + "description": "Record type management. Limits: max 100 record types per workspace; max 255 characters for display name." + }, + { + "name": "Records", + "description": "Record management. Limits: max 25,000 records per record type; max 100 records per bulk operation; max 500 connections per reference field; max 10 connections per hierarchy field." + }, + { + "name": "Fields", + "description": "Field management. Per-record-type quotas: max 500 fields total; max 20 PARAGRAPH (long-text) fields; max 20 FORMULA fields; max 30 REFERENCE fields. Field display names must be unique within a record type and capped at 256 characters. Formula expressions: max 50,000 characters; lookup depth: max 5." + }, + { + "name": "Views", + "description": "View management. Limits: max 100 personal views per record type; max 255 characters for view name." + }, + { + "name": "Permissions", + "description": "Resource permissions, member management, and access requests." + }, + { + "name": "Limits and Quotas", + "description": "Public API V2 limits and quotas:\n\n- Workspaces per tenant: 100,000\n- Record types per workspace: 100\n- Records per record type: 25,000\n- Records per bulk request: 100\n- Fields per record type: 500\n- PARAGRAPH (long-text) fields per record type: 20\n- FORMULA fields per record type: 20\n- REFERENCE fields per record type: 30\n- Connections per reference field: 500\n- Connections per hierarchy field: 10\n- Personal views per record type: 100\n- Lookup depth: 5\n- Hierarchy depth: 4\n- Hierarchy count per workspace: 5\n- Formula expression length: 50,000 characters\n- Display name length: 256 characters\n\nExceeding any of these limits returns an HTTP 403 with a specific `errorCode` (e.g. `RECORD_TYPE_LIMIT_EXCEEDED`, `FIELD_LIMIT_EXCEEDED`, `VIEW_LIMIT_EXCEEDED`)." + } + ], + "paths": { + "/v2/workspaces/{id}": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Get Workspace", + "description": "Retrieve a workspace by its ID.", + "operationId": "getWorkspace", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the workspace to be retrieved", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Workspaces" + ], + "summary": "Update Workspace", + "description": "Update an existing workspace using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateWorkspace", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the workspace to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Workspaces" + ], + "summary": "Delete Workspace", + "description": "Delete a workspace by its ID.", + "operationId": "deleteWorkspace", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the workspace to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Workspaces" + ], + "summary": "Patch Workspace", + "description": "Partially update a workspace using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchWorkspace", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the workspace to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/views/{id}": { + "get": { + "tags": [ + "Views" + ], + "summary": "Get View", + "description": "Retrieve a view by its ID.", + "operationId": "getView", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the view to be retrieved", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Views" + ], + "summary": "Update View", + "description": "Update an existing view using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateView", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the view to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Views" + ], + "summary": "Delete View", + "description": "Delete a view by its ID.", + "operationId": "deleteView", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the view to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Views" + ], + "summary": "Patch View", + "description": "Partially update a view using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchView", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the view to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/records/{id}": { + "get": { + "tags": [ + "Records" + ], + "summary": "Get Record", + "description": "Retrieve a record by its ID.", + "operationId": "getRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be retrieved", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Records" + ], + "summary": "Update Record", + "description": "Update an existing record using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_CONNECTION_LIMIT_EXCEEDED, HIERARCHY_RECORD_CONNECTION_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Delete Record", + "description": "Delete a record by its ID.", + "operationId": "deleteRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Records" + ], + "summary": "Patch Record", + "description": "Partially update an existing record using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged. Setting a field value to JSON null (e.g. {\"data\":{\"F123\":null}}) explicitly clears that field; omitting the key leaves the field untouched. For list-type fields (connections, multi-select), you can use operational updates: [{\"op\": \"add\", \"value\": [...]}, {\"op\": \"remove\", \"value\": [...]}].", + "operationId": "patchRecord", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_CONNECTION_LIMIT_EXCEEDED, HIERARCHY_RECORD_CONNECTION_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/bulk": { + "put": { + "tags": [ + "Records" + ], + "summary": "Bulk Update Records", + "description": "Update multiple records using PUT semantics (full replacement). All fields not provided will be set to null. Each record must include an id. Limited to 100 records per request.", + "operationId": "bulkUpdateRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of records to update. Each must include an id (max 100).", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Bulk Create Records", + "description": "Create multiple records in a record type in a single request. Limited to 100 records per request.", + "operationId": "bulkCreateRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of records to create (max 100)", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "All items created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Bulk Delete Records", + "description": "Delete multiple records by their IDs in a single request. Limited to 100 records per request.", + "operationId": "bulkDeleteRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkDeleteRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request (empty ids list)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Records" + ], + "summary": "Bulk Patch Records", + "description": "Partially update multiple records using PATCH semantics (merge-patch). Only provided fields are updated; omitted fields remain unchanged. Each record must include an id. Limited to 100 records per request.", + "operationId": "bulkPatchRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "description": "List of partial record updates. Each must include an id (max 100).", + "items": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items patched successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Mixed results — some items succeeded, some failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{id}": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Record Type", + "description": "Retrieve a record type by its ID.", + "operationId": "getRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be retrieved", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "scopeWorkspaceId", + "in": "query", + "description": "ID of the workspace to scope dynamic field resolution for global/dynamic record types", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Record Types" + ], + "summary": "Update Record Type", + "description": "Update an existing record type using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_IN_HIERARCHY)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Record Types" + ], + "summary": "Permanently delete record type", + "description": "Delete a record type and all its associated data, fields, and records. This action is irreversible.", + "operationId": "deleteRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_IN_HIERARCHY)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Record Types" + ], + "summary": "Patch Record Type", + "description": "Partially update a record type using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchRecordType", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record type to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/fields/{id}": { + "get": { + "tags": [ + "Fields" + ], + "summary": "Get Field", + "description": "Retrieve a field by its ID.", + "operationId": "getField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be retrieved", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "put": { + "tags": [ + "Fields" + ], + "summary": "Update Field", + "description": "Update an existing field using PUT (full replacement). All fields not provided in the request will be set to null.", + "operationId": "updateField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Fields" + ], + "summary": "Delete Field", + "description": "Delete a field by its ID.", + "operationId": "deleteField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Fields" + ], + "summary": "Patch Field", + "description": "Partially update a field using PATCH (merge-patch semantics). Only provided fields will be updated; omitted fields remain unchanged.", + "operationId": "patchField", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the field to be patched", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "409": { + "description": "Conflict (write conflict, retry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Get All Workspaces", + "description": "Retrieve a cursor-paginated list of all workspaces.", + "operationId": "getWorkspaces", + "parameters": [ + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-50, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 50, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseWorkspaceDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Workspaces" + ], + "summary": "Create Workspace", + "description": "Create a new workspace.", + "operationId": "createWorkspace", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (admin only, or WORKSPACE_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/record-types": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Record Types by Workspace", + "description": "Retrieve a cursor-paginated list of record types for a specific workspace.", + "operationId": "getRecordTypesByWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseRecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Record Types" + ], + "summary": "Create Record Type", + "description": "Create a new record type in a workspace. Subject to limits: max 100 record types per workspace.", + "operationId": "createRecordType", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "sectionIndex", + "in": "query", + "description": "Zero-based index of the section to add the record type to. Defaults to 0 (first section).", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0, + "minimum": 0 + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordTypeDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/record-types/{recordTypeId}/detach": { + "post": { + "tags": [ + "Record Types" + ], + "summary": "Detach record type from workspace", + "description": "Remove a dynamic (global) record type usage from a workspace. The underlying global record type and its data are preserved; only the workspace association is removed.", + "operationId": "detachRecordTypeFromWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type to detach", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/records/{id}/thumbnail": { + "post": { + "tags": [ + "Records" + ], + "summary": "Upload thumbnail on record", + "description": "Replace the record's thumbnail with the uploaded image. Each successful upload produces a new URL, even for identical content.", + "operationId": "uploadThumbnail", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary", + "description": "PNG or JPEG image file" + } + }, + "required": [ + "file" + ] + } + } + } + }, + "responses": { + "201": { + "description": "Thumbnail uploaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Invalid image (THUMBNAIL_EMPTY, THUMBNAIL_INVALID_FORMAT, THUMBNAIL_INVALID_CONTENT, THUMBNAIL_SIZE_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "413": { + "description": "Upload too large (UPLOAD_SIZE_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Records" + ], + "summary": "Delete thumbnail on record", + "description": "Remove the record's thumbnail. Idempotent — succeeds with 204 even when no thumbnail is set.", + "operationId": "deleteThumbnail", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Thumbnail removed" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/views": { + "get": { + "tags": [ + "Views" + ], + "summary": "Get Views by Record Type", + "description": "Retrieve a cursor-paginated list of views for a specific record type.", + "operationId": "getViewsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseViewDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Views" + ], + "summary": "Create View", + "description": "Create a new view for a record type. Subject to limits: max 100 personal views per record type.", + "operationId": "createView", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (VIEW_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records": { + "get": { + "tags": [ + "Records" + ], + "summary": "Get Records by Record Type", + "description": "Retrieve a page-based paginated list of records for a specific record type. Uses standard page/size query parameters (default page=0, size=20, sorted by createdAt).", + "operationId": "getRecordsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 20, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "default": [ + "createdAt,ASC" + ], + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PageRecordDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Create Record", + "description": "Create a new record in a record type. Subject to limits: max 25,000 records per record type.", + "operationId": "createRecord", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (RECORD_TYPE_RECORD_LIMIT_EXCEEDED)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "422": { + "description": "Unprocessable Entity (back-reference conflict)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/search": { + "get": { + "tags": [ + "Records" + ], + "summary": "Search Records (GET)", + "description": "Search records using query parameters. Accepts a JSON filter string using the composite filter pattern, field projection, and alias-based field access. Returns page-based paginated records along with group information.", + "operationId": "searchRecordsGet", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "recordTypeAlias", + "in": "query", + "description": "Alias of the record type", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "filter", + "in": "query", + "description": "JSON filter using the composite filter pattern. Example: {\"operator\":\"AND\",\"conditions\":[{\"fieldId\":\"status\",\"condition\":\"IS\",\"value\":\"Active\"}]}", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "groupingFieldIds", + "in": "query", + "description": "List of field IDs to group results by", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e000,F693ab1c96f11ea3f4175e001" + }, + { + "name": "scopeWorkspaceIds", + "in": "query", + "description": "List of workspace IDs to scope the search to (for global record types)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "example": "Ws123,Ws456" + }, + { + "name": "globalRecordTypeWorkspaceFieldId", + "in": "query", + "description": "ID of the global record type workspace field (for global record types)", + "required": false, + "schema": { + "type": "string" + }, + "example": "F693ab1c96f11ea3f4175e717" + }, + { + "name": "fieldIds", + "in": "query", + "description": "List of field IDs to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e710,F693ab1c96f11ea3f4175e711" + }, + { + "name": "fieldAliases", + "in": "query", + "description": "List of field aliases to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "name,description" + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchPageDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid filter parameter)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Records" + ], + "summary": "Search Records (POST)", + "description": "Search records using the composite filter pattern with strongly-typed conditions. Supports recursive AND/OR filter nesting, sorting, grouping, field projection, and alias-based field access. Returns page-based paginated records along with group information.", + "operationId": "searchRecordsPost", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aliased", + "in": "query", + "description": "Flag to include alias support in response (field keys will be aliases instead of IDs)", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "fieldIds", + "in": "query", + "description": "List of field IDs to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "F693ab1c96f11ea3f4175e710,F693ab1c96f11ea3f4175e711" + }, + { + "name": "fieldAliases", + "in": "query", + "description": "List of field aliases to include in the record's data", + "required": false, + "schema": { + "type": "array", + "default": [ + "*" + ], + "items": { + "type": "string" + } + }, + "example": "name,description" + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "minimum": 1 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordSearchPageDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid filter / sort / group)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/records/move": { + "post": { + "tags": [ + "Records" + ], + "summary": "Move Records", + "description": "Reorder one or more records within a record type by specifying where to place them. Provide exactly one of putAfterRecordId (place after) or putBeforeRecordId (place before). Maximum 100 records per request. Requires EDIT permission on the record type. Move is all-or-nothing: on failure, no records are reordered.", + "operationId": "moveRecords", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MoveRecordsRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "All items moved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "207": { + "description": "Move failed — all records remain in original positions", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordBulkResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid move request)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type or anchor record not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/record-types/{recordTypeId}/fields": { + "get": { + "tags": [ + "Fields" + ], + "summary": "Get Fields by Record Type", + "description": "Retrieve a cursor-paginated list of fields for a specific record type.", + "operationId": "getFieldsByRecordType", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseFieldDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Fields" + ], + "summary": "Create Field", + "description": "Create a new field in a record type. Subject to limits: max 500 fields per record type, max 20 long-text fields, max 20 formula fields, max 30 reference fields per record type.", + "operationId": "createField", + "parameters": [ + { + "name": "recordTypeId", + "in": "path", + "description": "ID of the record type", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + }, + "400": { + "description": "Bad Request (validation failure)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden (FIELD_LIMIT_EXCEEDED, LONG_TEXT_FIELD_LIMIT_EXCEEDED, FORMULA_FIELD_COUNT_LIMIT_EXCEEDED, REFERENCE_FIELDS_COUNT_LIMIT_EXCEEDED, FIELD_DISPLAY_NAME_NOT_UNIQUE)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Type Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/requests": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "List pending access requests for a resource", + "description": "Returns all pending access requests for the given resource. Requires MANAGE permission.", + "operationId": "getAccessRequests", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessRequestDto" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "post": { + "tags": [ + "Permissions" + ], + "summary": "Request access to a resource", + "description": "Creates or updates an access request for the current user on the given resource.", + "operationId": "createAccessRequest", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Object containing the ID of the created access request", + "example": { + "id": "AR1234567890" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Permissions" + ], + "summary": "Dismiss access requests", + "description": "Dismisses the specified access requests by ID. Requires MANAGE permission.", + "operationId": "deleteAccessRequests", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteAccessRequestsDto" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/members": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get all members and their roles for a resource", + "description": "Lists all subjects (users, groups, teams) that have an explicit sharing relation on the resource. Requires MANAGE permission.", + "operationId": "getMembers", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MemberPermissionDto" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Permissions" + ], + "summary": "Bulk grant, update, or revoke member permissions", + "description": "Grants new roles, changes existing roles, or revokes access for the provided subjects. Requires MANAGE permission.", + "operationId": "updateMembers", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMembersRequestDto" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/workspaces/{workspaceId}/global-record-types": { + "get": { + "tags": [ + "Record Types" + ], + "summary": "Get Global Record Types", + "description": "Retrieve a cursor-paginated list of global record types available to attach to a specific workspace.", + "operationId": "getGlobalRecordTypes", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "ID of the workspace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseRecordTypeDto" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Workspace Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/records/{id}/history": { + "get": { + "tags": [ + "Records" + ], + "summary": "Get Record Field Change History", + "description": "Retrieve a cursor-paginated list of field change events for a specific record.", + "operationId": "getHistory", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the record", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Cursor from the previous page response for fetching the next page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of items to return per page (1-50, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20, + "maximum": 50, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CursorResponseHistoryEntryDto" + } + } + } + }, + "400": { + "description": "Bad Request (invalid cursor or limit)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "404": { + "description": "Record Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get current user's effective permissions on a resource", + "description": "Returns the current user's effective canView, canEdit, canDelete, and canAdd flags for the given resource.", + "operationId": "getMyPermissions", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (workspaces, record-types, records, views)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + }, + "/v2/permissions/{resourceType}/{resourceId}/inheritance": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Get inheritance setting for a record-type", + "description": "Returns whether workspace members inherit their workspace-level access on the record type. Only valid for record-types.", + "operationId": "getInheritance", + "parameters": [ + { + "name": "resourceType", + "in": "path", + "description": "Type of resource (must be record-types)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "description": "ID of the resource", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InheritanceDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ProblemDetail" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "RecordTypeSectionDto": { + "type": "object", + "description": "Section for organizing and grouping record types within a workspace. Sections are ordered by their position in the array.", + "properties": { + "displayName": { + "type": "string", + "description": "Display name of the record type section", + "example": "Marketing", + "maxLength": 256, + "minLength": 0 + }, + "recordTypeIds": { + "type": "array", + "description": "List of record type IDs included in this section", + "items": { + "type": "string" + } + } + }, + "required": [ + "displayName" + ] + }, + "UserReferenceDto": { + "type": "object", + "description": "Reference to a user with identifier and display name", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the user", + "example": "1C341E7B682505430A494138@0bd0200063c87f9749412b.e", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Display name of the user", + "example": "Jane Doe", + "readOnly": true + } + } + }, + "WorkspaceBaseDto": { + "type": "object", + "description": "Base class for Workspace DTOs containing common workspace properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "Ws69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the workspace", + "example": "marketing-workspace", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Display name of the workspace. Maximum 256 characters; cannot be blank.", + "example": "Marketing Workspace", + "maxLength": 256, + "minLength": 0, + "pattern": "(?s)^\\s*\\S.*$" + }, + "description": { + "type": "string", + "description": "Description of the workspace purpose and content. Maximum 1024 characters.", + "example": "Workspace for managing marketing campaigns and assets", + "maxLength": 1024, + "minLength": 0 + }, + "color": { + "type": "string", + "description": "Color theme for the workspace", + "example": "blue" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the workspace", + "example": "briefcase" + }, + "ownerId": { + "type": "string", + "description": "User ID of the workspace owner", + "example": "1C341E7B682505430A494138@0bd0200063c87f9749412b.e" + }, + "recordTypeSections": { + "type": "array", + "description": "List of record type sections for organizing record types", + "items": { + "$ref": "#/components/schemas/RecordTypeSectionDto" + } + } + } + }, + "V2FieldError": { + "type": "object", + "description": "Field-level error detail used in validation errors and per-item batch failures.", + "properties": { + "field": { + "type": "string", + "description": "Name of the field or path that caused the error.", + "example": "name" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the error for this field.", + "example": "Workspace name can not be blank" + }, + "code": { + "type": "string", + "description": "Machine-readable code identifying the validation rule that failed.", + "example": "NotBlank" + } + } + }, + "V2ProblemDetail": { + "type": "object", + "description": "RFC 7807 Problem Details error response for V2 endpoints.", + "properties": { + "title": { + "type": "string", + "description": "Short, human-readable summary of the error type. Same for all occurrences of the same error.", + "example": "Not found" + }, + "status": { + "type": "integer", + "format": "int32", + "description": "HTTP status code of the response.", + "example": 404 + }, + "detail": { + "type": "string", + "description": "Human-readable, resource-specific explanation of this error occurrence. Always English.", + "example": "Record type with ID 'Rt69b14f7e' was not found." + }, + "errorCode": { + "type": "string", + "description": "Machine-readable error code (enum name).", + "example": "ENTITY_WITH_ATTRIBUTE_NOT_FOUND" + }, + "messageArguments": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Named parameters used to compose the detail message. Values are always strings.", + "example": { + "recordTypeId": "Rt69b14f7e" + } + }, + "requestId": { + "type": "string", + "description": "Request correlation ID for tracing and support.", + "example": "5b1f7a8c-2c0e-4a8f-9c4f-2a3b1c0e4d5f" + }, + "errors": { + "type": "array", + "description": "Field-level or per-item error details. Present for validation, business-rule, or batch failures.", + "items": { + "$ref": "#/components/schemas/V2FieldError" + } + } + }, + "required": [ + "detail", + "errorCode", + "requestId", + "status", + "title" + ] + }, + "Coloring": { + "type": "object", + "properties": { + "record": { + "$ref": "#/components/schemas/RecordColoring" + }, + "group": { + "$ref": "#/components/schemas/GroupColoring" + } + } + }, + "ColumnMetadata": { + "type": "object", + "properties": { + "width": { + "type": "integer", + "format": "int32" + }, + "fieldId": { + "type": "string" + }, + "visibility": { + "type": "boolean" + }, + "aggregationFunction": { + "type": "string", + "enum": [ + "SUM", + "AVG", + "MIN", + "MAX" + ] + } + } + }, + "DynamicFieldMetadataDto": { + "type": "object", + "description": "Dynamic field metadata for global/dynamic record types", + "properties": { + "scopeWorkspaceId": { + "type": "string", + "description": "Workspace ID this view is scoped to", + "example": "Ws69b14f7e0e38f35f28c3ccee" + }, + "dynamicFieldIds": { + "type": "array", + "description": "Field IDs that are workspace-specific (dynamic) in this view", + "items": { + "type": "string" + }, + "uniqueItems": true + } + } + }, + "FilterColoringRule": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "color": { + "type": "string" + }, + "appliedFilters": { + "type": "array", + "items": {} + } + } + }, + "GroupColoring": { + "type": "object", + "properties": { + "selected": { + "type": "string", + "enum": [ + "DEFAULT", + "FIELD" + ] + } + } + }, + "GroupDto": { + "type": "object", + "description": "Grouping specification", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to group by", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "direction": { + "type": "string", + "description": "Sort direction for the grouped values (asc or desc). Defaults to asc if omitted.", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + } + }, + "required": [ + "fieldId" + ] + }, + "RecordColoring": { + "type": "object", + "properties": { + "selected": { + "type": "string", + "enum": [ + "RECORD_TYPE", + "RECORD", + "FIELD", + "GROUP", + "FILTER", + "NONE" + ] + }, + "fieldId": { + "type": "string" + }, + "highlightFullRow": { + "type": "boolean" + }, + "filterColoringRules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterColoringRule" + } + } + } + }, + "SortDto": { + "type": "object", + "description": "Sort specification", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to sort by", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "direction": { + "type": "string", + "description": "Sort direction (asc or desc). Defaults to asc if omitted.", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + } + }, + "required": [ + "fieldId" + ] + }, + "ViewDto": { + "type": "object", + "description": "View data containing all view properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "name": { + "type": "string", + "description": "Name of the view. Maximum 255 characters; cannot be blank. Each record type allows up to 100 personal views.", + "example": "My Table View", + "maxLength": 255, + "minLength": 0 + }, + "type": { + "type": "string", + "description": "Type of the view (TABLE, TIMELINE, CALENDAR, LIST, GALLERY)", + "enum": [ + "TABLE", + "TIMELINE", + "CALENDAR", + "LIST", + "GALLERY" + ], + "example": "TABLE", + "minLength": 1 + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this view belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "filter": { + "type": "array", + "description": "Filter conditions applied to records in this view", + "example": [], + "items": { + "$ref": "#/components/schemas/FilterNodeDto" + } + }, + "grouping": { + "type": "array", + "description": "Grouping configuration for records in this view", + "items": { + "$ref": "#/components/schemas/GroupDto" + } + }, + "sorting": { + "type": "array", + "description": "Sorting configuration for records in this view", + "items": { + "$ref": "#/components/schemas/SortDto" + } + }, + "metadata": { + "$ref": "#/components/schemas/ViewMetadataDto", + "description": "View-specific metadata (column widths, date fields, etc.)" + }, + "isHidden": { + "type": "boolean", + "description": "Whether this view is hidden from the view list", + "example": false + }, + "isPublicShared": { + "type": "boolean", + "description": "Whether this view is publicly shared via a link", + "example": false, + "readOnly": true + }, + "isRestricted": { + "type": "boolean", + "description": "Whether this view is restricted (limited access for global/dynamic record types)", + "example": false, + "readOnly": true + } + }, + "required": [ + "name", + "type" + ] + }, + "ViewMetadataDto": { + "type": "object", + "description": "View metadata containing view-type specific configuration", + "properties": { + "type": { + "type": "string", + "description": "Type of the view metadata (should match view type)", + "example": "TABLE" + }, + "showThumbnail": { + "type": "boolean", + "description": "Whether to show thumbnail images in the view", + "example": true + }, + "showRecordColoring": { + "type": "boolean", + "description": "Whether to show record coloring in the view", + "example": false + }, + "columnMetadata": { + "type": "array", + "description": "Column metadata for table views (visibility and width)", + "items": { + "$ref": "#/components/schemas/ColumnMetadata" + } + }, + "newColumnMetadata": { + "type": "array", + "description": "New column metadata for table views (visible fields only)", + "items": { + "$ref": "#/components/schemas/ColumnMetadata" + } + }, + "rowOrder": { + "type": "array", + "description": "Custom row order for table views (deprecated)", + "items": { + "type": "string" + } + }, + "startDateKey": { + "type": "string", + "description": "Field ID of the start date field (required for timeline and calendar views)", + "example": "F69b14f7e0e38f35f28c3ccee" + }, + "endDateKey": { + "type": "string", + "description": "Field ID of the end date field (for timeline and calendar views)", + "example": "F69b14f7e0e38f35f28c3ccef" + }, + "timelineScale": { + "type": "string", + "description": "Timeline scale type for timeline views", + "enum": [ + "YEAR", + "QUARTER", + "MONTH", + "WEEK" + ] + }, + "cardFieldIds": { + "type": "array", + "description": "Field IDs to display on timeline bars or calendar cards", + "items": { + "type": "string" + } + }, + "coloring": { + "$ref": "#/components/schemas/Coloring", + "description": "Coloring configuration for conditional formatting" + }, + "rowHeight": { + "type": "string", + "description": "Row height setting for table and calendar views", + "enum": [ + "SHORT", + "COMPACT", + "MEDIUM", + "TALL", + "FIT_CONTENT" + ] + }, + "truncateRecordContent": { + "type": "boolean", + "description": "Whether to truncate record content in timeline views", + "example": false + }, + "dynamicFieldMetadata": { + "$ref": "#/components/schemas/DynamicFieldMetadataDto", + "description": "Dynamic field metadata for global/dynamic record types" + } + } + }, + "FilterCondition": { + "type": "string", + "description": "Supported filter conditions for record search", + "enum": [ + "CONTAINS", + "DOES_NOT_CONTAIN", + "IS", + "IS_NOT", + "IS_EMPTY", + "IS_NOT_EMPTY", + "GREATER_THAN", + "GREATER_THAN_OR_EQUAL", + "LESS_THAN", + "LESS_THAN_OR_EQUAL", + "IS_AFTER", + "IS_BEFORE", + "IS_BETWEEN", + "IS_NOT_BETWEEN", + "IS_ANY_OF", + "IS_NONE_OF", + "HAS_ANY_OF", + "HAS_ALL_OF", + "HAS_NONE_OF", + "IS_EXACTLY" + ] + }, + "FilterConditionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FilterNodeDto" + }, + { + "type": "object", + "properties": { + "fieldId": { + "type": "string", + "description": "ID or alias of the field to filter on", + "example": "F693ab1c96f11ea3f4175e710", + "minLength": 1 + }, + "condition": { + "$ref": "#/components/schemas/FilterCondition", + "description": "Filter condition to apply" + }, + "value": { + "description": "Value to compare against. Omit for unary conditions (IS_EMPTY, IS_NOT_EMPTY). Use an array for range conditions (IS_BETWEEN) or multi-value conditions (IS_ANY_OF). For People fields (USER, CREATED_BY, UPDATED_BY, APPROVED_BY), by default plain string values are interpreted as Adobe IMS user IDs when the customer is IMS-migrated; otherwise they are interpreted as Workfront user IDs. To explicitly set the ID type and avoid ambiguity, pass a typed object such as {\"id\":\"63e3b13000078c1795146248182d15dc\",\"idType\":\"WF\"} (use \"idType\":\"IMS\" for Adobe IMS IDs).", + "example": "Active" + }, + "matchExternalId": { + "type": "boolean", + "description": "When true, values for REFERENCE fields are treated as external connection IDs and resolved to internal record IDs before the search executes. Only valid for external REFERENCE fields (isExternal=true)." + } + } + } + ], + "description": "A leaf filter condition applied to a single field", + "required": [ + "condition", + "fieldId" + ] + }, + "FilterGroupDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FilterNodeDto" + }, + { + "type": "object", + "properties": { + "operator": { + "$ref": "#/components/schemas/FilterOperator", + "description": "Logical operator to combine conditions" + }, + "conditions": { + "type": "array", + "description": "List of filter nodes: leaf conditions or nested groups", + "items": { + "$ref": "#/components/schemas/FilterNodeDto" + }, + "minItems": 1 + } + } + } + ], + "description": "A group of filter conditions combined with a logical operator (AND/OR). Supports recursive nesting for complex filter logic.", + "required": [ + "conditions", + "operator" + ] + }, + "FilterNodeDto": { + "description": "A node in the filter tree: either a leaf condition or a nested group", + "oneOf": [ + { + "$ref": "#/components/schemas/FilterConditionDto" + }, + { + "$ref": "#/components/schemas/FilterGroupDto" + } + ] + }, + "FilterOperator": { + "type": "string", + "description": "Logical operator for combining filter conditions", + "enum": [ + "AND", + "OR" + ] + }, + "CoverImageDto": { + "type": "object", + "description": "Cover image information for a record", + "properties": { + "url": { + "type": "string", + "description": "URL of the cover image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png" + }, + "position": { + "type": "integer", + "format": "int32", + "description": "Vertical position of the cover image", + "example": 0 + } + } + }, + "RecordBaseDto": { + "type": "object", + "description": "Partial record data to update. Only provided fields will be updated.", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the record", + "example": "Rc69b2a78e63cd0d41a1bedf2e", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this record belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "data": { + "type": "object", + "additionalProperties": {}, + "description": "Field data for the record as key-value pairs where keys are field IDs", + "example": { + "F693ab1c96f11ea3f4175e710": "Campaign Name", + "F693ab1c96f11ea3f4175e711": "2026-03-15" + } + }, + "thumbnailUrl": { + "type": "string", + "description": "URL of the record thumbnail image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png", + "readOnly": true + }, + "coverImage": { + "$ref": "#/components/schemas/CoverImageDto", + "description": "Cover image information for the record", + "readOnly": true + } + } + }, + "RecordDto": { + "type": "object", + "description": "Complete record data including all record properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the record", + "example": "Rc69b2a78e63cd0d41a1bedf2e", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "recordTypeId": { + "type": "string", + "description": "ID of the record type this record belongs to", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "data": { + "type": "object", + "additionalProperties": {}, + "description": "Field data for the record as key-value pairs where keys are field IDs", + "example": { + "F693ab1c96f11ea3f4175e710": "Campaign Name", + "F693ab1c96f11ea3f4175e711": "2026-03-15" + } + }, + "thumbnailUrl": { + "type": "string", + "description": "URL of the record thumbnail image", + "example": "/maestro/static/thumbnail/default/thumbnail-1.png", + "readOnly": true + }, + "coverImage": { + "$ref": "#/components/schemas/CoverImageDto", + "description": "Cover image information for the record", + "readOnly": true + }, + "recordTypeAlias": { + "type": "string", + "description": "Alias of the record type (only populated when aliased=true)", + "example": "campaigns", + "readOnly": true + } + } + }, + "RecordBulkItemErrorDto": { + "type": "object", + "description": "Per-item error detail in a bulk record operation response.", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable error code.", + "example": "ENTITY_WITH_ATTRIBUTE_NOT_FOUND" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of this specific item failure.", + "example": "Record with ID 'Rc123' was not found." + }, + "details": { + "type": "object", + "additionalProperties": {}, + "description": "Optional structured context for this item failure." + } + } + }, + "RecordBulkRequestErrorDto": { + "type": "object", + "description": "Request-level error affecting multiple items in a bulk operation.", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable error code.", + "example": "RATE_LIMIT_EXCEEDED" + }, + "message": { + "type": "string", + "description": "Human-readable description of the request-level error.", + "example": "Bulk operation limit of 100 items per request exceeded; 58 items were skipped" + }, + "affectedIds": { + "type": "array", + "description": "IDs of the items affected by this request-level error.", + "items": { + "type": "string" + } + } + } + }, + "RecordBulkResponseDto": { + "type": "object", + "description": "Response envelope for V2 bulk record operations.", + "properties": { + "status": { + "type": "string", + "description": "Overall bulk operation status.", + "enum": [ + "success", + "partial", + "failed" + ] + }, + "total": { + "type": "integer", + "format": "int32", + "description": "Number of input items submitted.", + "example": 10 + }, + "succeeded": { + "type": "integer", + "format": "int32", + "description": "Number of successful item results.", + "example": 3 + }, + "failed": { + "type": "integer", + "format": "int32", + "description": "Number of failed item results.", + "example": 7 + }, + "requestId": { + "type": "string", + "description": "Request correlation ID for tracing and support.", + "example": "5b1f7a8c-2c0e-4a8f-9c4f-2a3b1c0e4d5f" + }, + "errors": { + "type": "array", + "description": "Request-level errors affecting multiple items.", + "items": { + "$ref": "#/components/schemas/RecordBulkRequestErrorDto" + } + }, + "results": { + "type": "array", + "description": "Per-item results in the same order as the input.", + "items": { + "$ref": "#/components/schemas/RecordBulkResultItemDtoObject" + } + } + } + }, + "RecordBulkResultItemDtoObject": { + "type": "object", + "description": "Result for one input item in a bulk record operation.", + "properties": { + "requestIndex": { + "type": "integer", + "format": "int32", + "description": "Zero-based index of the input item.", + "example": 0 + }, + "id": { + "type": "string", + "description": "Record ID for this item when available.", + "example": "Rc69b2a78e63cd0d41a1bedf2e" + }, + "status": { + "type": "string", + "description": "Per-item operation status.", + "enum": [ + "success", + "error" + ] + }, + "error": { + "$ref": "#/components/schemas/RecordBulkItemErrorDto", + "description": "Error payload. Present only when status is error." + }, + "record": { + "$ref": "#/components/schemas/RecordDto", + "description": "Record payload. Present on successful create, update, and patch items." + } + } + }, + "AuthzSubjectDtoV2": { + "type": "object", + "description": "Authorization subject reference (user, group, team, etc.)", + "properties": { + "type": { + "type": "string", + "description": "Type of the authorization subject", + "enum": [ + "maestro/workspace", + "maestro/public_workspace", + "maestro/recordtype", + "maestro/record", + "redrock/user", + "redrock/group", + "redrock/cmpy", + "redrock/cust", + "redrock/teamob", + "redrock/role", + "ims/user", + "member", + "groupmember", + "maestro/view", + "maestro/dynamic_recordtype" + ], + "example": "redrock/user" + }, + "id": { + "type": "string", + "description": "ID of the authorization subject", + "example": "U123abc" + } + } + }, + "RecordTypeDto": { + "type": "object", + "description": "Complete record type data including linkability settings and external options", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the record type", + "example": "campaigns", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the record type. Maximum 255 characters; cannot be blank.", + "example": "Campaigns", + "maxLength": 255, + "minLength": 0 + }, + "description": { + "type": "string", + "description": "Description of the record type purpose. Maximum 1024 characters.", + "example": "Marketing campaigns and promotional activities", + "maxLength": 1024, + "minLength": 0 + }, + "primaryFieldId": { + "type": "string", + "description": "ID of the primary field for this record type", + "example": "F693ab1c96f11ea3f4175e716" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the record type", + "example": "diamond" + }, + "color": { + "type": "string", + "description": "Color theme for the record type", + "example": "purple" + }, + "isExternal": { + "type": "boolean", + "description": "Indicates if this is an external record type", + "example": false + }, + "sourceRecordTypeId": { + "type": "string", + "description": "ID of an existing global record type to attach to the workspace (used only on create). When provided, the record type is not created but attached as a dynamic usage.", + "example": "Rt69b14f7e0e38f35f28c3ccee", + "writeOnly": true + }, + "externalOptions": { + "$ref": "#/components/schemas/RecordTypeExternalOptionsDto", + "description": "External options for external record types" + }, + "linkableWithAllWorkspaces": { + "type": "boolean", + "description": "Indicates if this record type can be linked with all workspaces", + "example": false + }, + "linkableWithWorkspaceIds": { + "type": "array", + "description": "List of workspace IDs that this record type can be linked with", + "items": { + "type": "string" + } + }, + "globalRecordTypeWorkspaceFieldId": { + "type": "string", + "description": "ID of the global record type workspace field", + "example": "F693ab1c96f11ea3f4175e717", + "readOnly": true + }, + "isGlobal": { + "type": "boolean", + "description": "Indicates if this is a global record type", + "example": false, + "readOnly": true + }, + "authorizedToCreateDynamicRecordType": { + "type": "array", + "description": "List of subjects authorized to create dynamic record types from this global record type", + "items": { + "$ref": "#/components/schemas/AuthzSubjectDtoV2" + } + }, + "primaryWorkspaceId": { + "type": "string", + "description": "ID of the workspace where this global record type was originally created", + "example": "Ws69b14f7e0e38f35f28c3ccee", + "readOnly": true + }, + "dynamicWorkspaceIds": { + "type": "array", + "description": "List of workspace IDs that use this global record type dynamically", + "items": { + "type": "string" + }, + "readOnly": true + } + }, + "required": [ + "displayName" + ] + }, + "RecordTypeExternalOptionsDto": { + "type": "object", + "description": "External options for external record types", + "properties": { + "connection": { + "type": "string", + "description": "External connection type", + "enum": [ + "WORKFRONT", + "BRAND", + "AEM", + "INTAKE" + ], + "example": "WORKFRONT" + }, + "object": { + "type": "string", + "description": "External object type", + "enum": [ + "PROJECT", + "PORTFOLIO", + "PROGRAM", + "COMPANY", + "GROUP", + "TEMPLATE", + "ASSET", + "BRAND", + "ORIGINAL_REQUEST" + ], + "example": "PROJECT" + }, + "fields": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Field mappings between external and internal fields" + } + } + }, + "FieldAttachmentOptionsDto": { + "type": "object", + "description": "Attachment field options", + "properties": { + "showThumbnail": { + "type": "boolean", + "description": "Whether to display attachment thumbnails" + }, + "showTitle": { + "type": "boolean", + "description": "Whether to display attachment titles" + } + } + }, + "FieldDateOptions": { + "type": "object", + "properties": { + "dateFormat": { + "type": "string", + "enum": [ + "locale", + "standard", + "friendly", + "european", + "iso" + ] + }, + "timeFormat": { + "type": "string", + "enum": [ + "h12", + "h24" + ] + }, + "useSameTimezoneForAllCollaborators": { + "type": "boolean" + }, + "timezoneId": { + "type": "string" + } + } + }, + "FieldDateOptionsDto": { + "type": "object", + "description": "Date field options", + "properties": { + "dateFormat": { + "type": "string", + "description": "Date format", + "enum": [ + "locale", + "standard", + "friendly", + "european", + "iso" + ] + }, + "timeFormat": { + "type": "string", + "description": "Time format", + "enum": [ + "h12", + "h24" + ] + } + } + }, + "FieldDto": { + "type": "object", + "description": "Field data for record types", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the field", + "example": "F693ab1c96f11ea3f4175e716", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the field", + "example": "campaign_name", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the field. Maximum 256 characters; must be unique within the parent record type.", + "example": "Campaign Name", + "maxLength": 256, + "minLength": 0 + }, + "type": { + "type": "string", + "description": "Type of the field. Subject to per-record-type quotas: max 20 PARAGRAPH (long text), max 20 FORMULA, max 30 REFERENCE.", + "enum": [ + "TEXT", + "PARAGRAPH", + "NUMBER", + "PERCENTAGE", + "CURRENCY", + "DATE", + "SINGLE_SELECT", + "MULTI_SELECT", + "CHECKBOX", + "REFERENCE", + "USER", + "FORMULA" + ], + "example": "TEXT" + }, + "description": { + "type": "string", + "description": "Description of the field. Maximum 512 characters.", + "example": "Name of the marketing campaign", + "maxLength": 512, + "minLength": 0 + }, + "linkedField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Linked field for reference and lookup fields" + }, + "options": { + "type": "array", + "description": "Field options for single-select and multi-select fields", + "items": { + "$ref": "#/components/schemas/FieldOptionDto" + } + }, + "defaultOptions": { + "type": "array", + "description": "Default options for single-select and multi-select fields", + "items": { + "type": "string" + } + }, + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptionsDto", + "description": "Date field options" + }, + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptionsDto", + "description": "Number field options for number, percentage, and currency fields" + }, + "referenceOptions": { + "$ref": "#/components/schemas/FieldReferenceOptionsDto", + "description": "Reference field options" + }, + "lookupOptions": { + "$ref": "#/components/schemas/FieldLookupOptionsDto", + "description": "Lookup field options" + }, + "formulaOptions": { + "$ref": "#/components/schemas/FieldFormulaOptionsDto", + "description": "Formula field options" + }, + "userOptions": { + "$ref": "#/components/schemas/FieldUserOptionsDto", + "description": "User field options" + }, + "defaultUsers": { + "type": "array", + "description": "Default user option", + "items": { + "type": "string" + } + }, + "attachmentOptions": { + "$ref": "#/components/schemas/FieldAttachmentOptionsDto", + "description": "Attachment field options" + }, + "hasError": { + "type": "boolean", + "description": "Indicates if the field has an error" + }, + "isHtmlNative": { + "type": "boolean", + "description": "Indicates if the long text field is HTML native" + }, + "metadata": { + "$ref": "#/components/schemas/FieldMetadataDto", + "description": "Field metadata" + } + } + }, + "FieldFormulaOptionsDto": { + "type": "object", + "description": "Formula field options", + "properties": { + "formula": { + "type": "string", + "description": "Formula expression" + }, + "returnType": { + "type": "string", + "description": "Return type of the formula", + "enum": [ + "DATE", + "DATETIME", + "NUMBER", + "PERCENTAGE", + "CURRENCY", + "TEXT", + "TEXT_ARRAY" + ] + }, + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptions", + "description": "Number options for number-type formulas" + }, + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptions", + "description": "Date options for date-type formulas" + } + } + }, + "FieldLookupOptionsDto": { + "type": "object", + "description": "Lookup field options", + "properties": { + "referenceFieldId": { + "type": "string", + "description": "Reference field ID" + }, + "rollup": { + "type": "string", + "description": "Rollup function (e.g., SUM, AVG, COUNT)" + }, + "sourceField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Source field being looked up" + } + } + }, + "FieldMetadataDto": { + "type": "object", + "description": "Field metadata", + "properties": { + "originType": { + "type": "string", + "description": "Origin type of the field" + }, + "extendedRollup": { + "type": "string", + "description": "Extended rollup information" + } + } + }, + "FieldNumberOptions": { + "type": "object", + "properties": { + "precision": { + "type": "integer", + "format": "int32" + }, + "allowNegatives": { + "type": "boolean" + }, + "currency": { + "type": "string", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "AON", + "ARS", + "AUD", + "AZN", + "BAM", + "BBD", + "BDT", + "BGL", + "BHD", + "BIF", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUP", + "CVE", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "GBP", + "GEL", + "GHC", + "GMD", + "GNF", + "GTQ", + "GYD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MRU", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZM", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SLL", + "SOS", + "SRD", + "SSP", + "STN", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TZS", + "UAH", + "UGS", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XOF", + "YER", + "ZAR", + "ZMK", + "ZWD" + ] + }, + "visualizationType": { + "type": "string", + "enum": [ + "TEXT", + "PROGRESS_BAR", + "PROGRESS_CIRCLE" + ] + } + } + }, + "FieldNumberOptionsDto": { + "type": "object", + "description": "Number field options for number, percentage, and currency fields", + "properties": { + "precision": { + "type": "integer", + "format": "int32", + "description": "Decimal places (0-4)" + }, + "allowNegatives": { + "type": "boolean", + "description": "Whether negative values are allowed" + }, + "currency": { + "type": "string", + "description": "Currency code (e.g. USD, EUR, GBP); only for currency fields", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "AON", + "ARS", + "AUD", + "AZN", + "BAM", + "BBD", + "BDT", + "BGL", + "BHD", + "BIF", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUP", + "CVE", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "GBP", + "GEL", + "GHC", + "GMD", + "GNF", + "GTQ", + "GYD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MRU", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZM", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SLL", + "SOS", + "SRD", + "SSP", + "STN", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TZS", + "UAH", + "UGS", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XOF", + "YER", + "ZAR", + "ZMK", + "ZWD" + ] + }, + "visualizationType": { + "type": "string", + "description": "Display format: TEXT (default), PROGRESS_BAR, or PROGRESS_CIRCLE", + "enum": [ + "TEXT", + "PROGRESS_BAR", + "PROGRESS_CIRCLE" + ] + } + } + }, + "FieldOptionDto": { + "type": "object", + "description": "Field option for single-select and multi-select fields", + "properties": { + "name": { + "description": "Name identifier for the option" + }, + "displayName": { + "type": "string", + "description": "Display name for the option" + }, + "color": { + "type": "string", + "description": "Color code for the option" + }, + "groupId": { + "type": "string", + "description": "Group ID for grouped options" + } + } + }, + "FieldReferenceExternalOptionsDto": { + "type": "object", + "description": "External reference options for external connections", + "properties": { + "connectionName": { + "type": "string", + "description": "Connection name" + }, + "objectName": { + "type": "string", + "description": "Object name in the external system" + }, + "connectionOptions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Connection-specific options" + } + } + }, + "FieldReferenceLookupFieldDto": { + "type": "object", + "description": "Lookup field configuration for reference fields", + "properties": { + "fieldId": { + "type": "string", + "description": "Field ID to auto-create as a lookup from the linked record type" + }, + "rollup": { + "type": "string", + "description": "Optional aggregation function: sum, avg, min, max, or dist" + } + } + }, + "FieldReferenceOptionsDto": { + "type": "object", + "description": "Reference field options", + "properties": { + "multiple": { + "type": "boolean", + "description": "Whether multiple records can be selected" + }, + "showThumbnail": { + "type": "boolean", + "description": "Whether to show thumbnail" + }, + "showTitle": { + "type": "boolean", + "description": "Whether to show title" + }, + "showColor": { + "type": "boolean", + "description": "Whether to show color" + }, + "recordTypeId": { + "type": "string", + "description": "Referenced record type ID" + }, + "isExternal": { + "type": "boolean", + "description": "Whether the reference is external" + }, + "createBackReference": { + "type": "boolean", + "description": "Whether to create a back reference" + }, + "backField": { + "$ref": "#/components/schemas/FieldDto", + "description": "Back reference field" + }, + "externalOptions": { + "$ref": "#/components/schemas/FieldReferenceExternalOptionsDto", + "description": "External options for external references" + }, + "filters": { + "type": "object", + "additionalProperties": {}, + "description": "Filters for the reference field" + }, + "lookupFields": { + "type": "array", + "description": "Lookup fields for the reference", + "items": { + "$ref": "#/components/schemas/FieldReferenceLookupFieldDto" + } + }, + "scopeWorkspaceIds": { + "type": "array", + "description": "Scope workspace IDs for global record types", + "items": { + "type": "string" + } + }, + "globalRecordTypeWorkspaceFieldId": { + "type": "string", + "description": "Global record type workspace field ID" + } + } + }, + "FieldUserOptionsDto": { + "type": "object", + "description": "User field options", + "properties": { + "multipleUsersAllowed": { + "type": "boolean", + "description": "Whether multiple users can be selected" + } + } + }, + "RecordTypeBaseDto": { + "type": "object", + "description": "Base record type data containing common record type properties", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the entity", + "example": "69a976d02587b929c9e26dfa", + "readOnly": true + }, + "createdBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who created this entity", + "readOnly": true + }, + "createdAt": { + "type": "string", + "description": "Date/time when this entity was created", + "example": "2026-01-15T10:30:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "updatedBy": { + "$ref": "#/components/schemas/UserReferenceDto", + "description": "User who last updated this entity", + "readOnly": true + }, + "updatedAt": { + "type": "string", + "description": "Date/time when this entity was last updated", + "example": "2026-01-15T14:45:00.000Z", + "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "readOnly": true + }, + "alias": { + "type": "string", + "description": "Unique alias identifier for the record type", + "example": "campaigns", + "readOnly": true + }, + "displayName": { + "type": "string", + "description": "Display name of the record type. Maximum 255 characters; cannot be blank.", + "example": "Campaigns", + "maxLength": 255, + "minLength": 0 + }, + "description": { + "type": "string", + "description": "Description of the record type purpose. Maximum 1024 characters.", + "example": "Marketing campaigns and promotional activities", + "maxLength": 1024, + "minLength": 0 + }, + "primaryFieldId": { + "type": "string", + "description": "ID of the primary field for this record type", + "example": "F693ab1c96f11ea3f4175e716" + }, + "icon": { + "type": "string", + "description": "Icon identifier for the record type", + "example": "diamond" + }, + "color": { + "type": "string", + "description": "Color theme for the record type", + "example": "purple" + }, + "isExternal": { + "type": "boolean", + "description": "Indicates if this is an external record type", + "example": false + }, + "sourceRecordTypeId": { + "type": "string", + "description": "ID of an existing global record type to attach to the workspace (used only on create). When provided, the record type is not created but attached as a dynamic usage.", + "example": "Rt69b14f7e0e38f35f28c3ccee", + "writeOnly": true + } + }, + "required": [ + "displayName" + ] + }, + "RecordSearchRequestDto": { + "type": "object", + "description": "Search criteria including filters, sorting, and grouping", + "properties": { + "recordTypeId": { + "type": "string", + "description": "ID of the record type to search within", + "example": "Rt69b14f7e0e38f35f28c3ccee" + }, + "recordTypeAlias": { + "type": "string", + "description": "Alias of the record type to search within", + "example": "campaigns" + }, + "filter": { + "$ref": "#/components/schemas/FilterGroupDto", + "description": "Filter criteria using the composite filter pattern. Supports recursive AND/OR nesting with strongly-typed conditions." + }, + "sort": { + "type": "array", + "description": "Sorting configuration for records", + "items": { + "$ref": "#/components/schemas/SortDto" + } + }, + "group": { + "type": "array", + "description": "Grouping configuration for records", + "items": { + "$ref": "#/components/schemas/GroupDto" + } + }, + "scopeWorkspaceIds": { + "type": "array", + "description": "List of workspace IDs to scope the search to (for global record types)", + "example": [ + "Ws123", + "Ws456" + ], + "items": { + "type": "string" + } + }, + "globalRecordTypeWorkspaceFieldId": { + "type": "string", + "description": "ID of the global record type workspace field (for global record types)", + "example": "F693ab1c96f11ea3f4175e717" + } + } + }, + "PageRecordDto": { + "type": "object", + "properties": { + "totalElements": { + "type": "integer", + "format": "int64" + }, + "totalPages": { + "type": "integer", + "format": "int32" + }, + "first": { + "type": "boolean" + }, + "last": { + "type": "boolean" + }, + "size": { + "type": "integer", + "format": "int32" + }, + "content": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RecordDto" + } + }, + "number": { + "type": "integer", + "format": "int32" + }, + "sort": { + "$ref": "#/components/schemas/SortObject" + }, + "numberOfElements": { + "type": "integer", + "format": "int32" + }, + "pageable": { + "$ref": "#/components/schemas/PageableObject" + }, + "empty": { + "type": "boolean" + } + } + }, + "PageableObject": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "format": "int64" + }, + "sort": { + "$ref": "#/components/schemas/SortObject" + }, + "unpaged": { + "type": "boolean" + }, + "paged": { + "type": "boolean" + }, + "pageNumber": { + "type": "integer", + "format": "int32" + }, + "pageSize": { + "type": "integer", + "format": "int32" + } + } + }, + "RecordGroupDto": { + "type": "object", + "description": "Group of records with common field values", + "properties": { + "fieldId": { + "type": "string", + "description": "ID of the field used for grouping", + "example": "F693ab1c96f11ea3f4175e716" + }, + "value": { + "description": "Value of the grouping field", + "example": "Active" + }, + "recordIds": { + "type": "array", + "description": "List of record IDs in this group", + "example": [ + "R123", + "R456", + "R789" + ], + "items": { + "type": "string" + } + }, + "count": { + "type": "integer", + "format": "int32", + "description": "Count of records in this group", + "example": 3 + } + } + }, + "RecordSearchPageDto": { + "type": "object", + "description": "Paginated search response containing records and groups", + "properties": { + "records": { + "$ref": "#/components/schemas/PageRecordDto", + "description": "Paginated records matching the search criteria" + }, + "groups": { + "type": "array", + "description": "List of record groups (if grouping was requested)", + "items": { + "$ref": "#/components/schemas/RecordGroupDto" + } + } + } + }, + "SortObject": { + "type": "object", + "properties": { + "empty": { + "type": "boolean" + }, + "unsorted": { + "type": "boolean" + }, + "sorted": { + "type": "boolean" + } + } + }, + "MoveRecordsRequestDto": { + "type": "object", + "description": "Move request specifying which records to move and where", + "properties": { + "recordIds": { + "type": "array", + "description": "IDs of the records to move, in the order they should appear at the destination.", + "example": [ + "Rc6796...01", + "Rc6796...02" + ], + "items": { + "type": "string", + "minLength": 1 + }, + "maxItems": 100, + "minItems": 0 + }, + "putAfterRecordId": { + "type": "string", + "description": "Place the moved records immediately AFTER this record. Mutually exclusive with putBeforeRecordId.", + "example": "Rc67a1..." + }, + "putBeforeRecordId": { + "type": "string", + "description": "Place the moved records immediately BEFORE this record. Mutually exclusive with putAfterRecordId.", + "example": "Rc67a2..." + } + }, + "required": [ + "recordIds" + ] + }, + "CreateAccessRequestDto": { + "type": "object", + "description": "Request body for creating an access request", + "properties": { + "message": { + "type": "string", + "description": "Optional message to include with the access request", + "maxLength": 2000, + "minLength": 0 + } + } + }, + "MemberGrantDto": { + "type": "object", + "description": "A subject and role to grant or update on a resource", + "properties": { + "subjectId": { + "type": "string", + "description": "ID of the user, group, team, role, or company", + "minLength": 1 + }, + "subjectType": { + "type": "string", + "description": "Type of the subject", + "enum": [ + "user", + "group", + "team", + "role", + "company" + ] + }, + "role": { + "type": "string", + "description": "Role to assign to the subject", + "enum": [ + "viewer", + "editor", + "manager" + ] + } + }, + "required": [ + "role", + "subjectId", + "subjectType" + ] + }, + "MemberRevokeDto": { + "type": "object", + "description": "A subject to revoke permissions from", + "properties": { + "subjectId": { + "type": "string", + "description": "ID of the subject to revoke access from", + "minLength": 1 + }, + "subjectType": { + "type": "string", + "description": "Type of the subject", + "enum": [ + "user", + "group", + "team", + "role", + "company" + ] + } + }, + "required": [ + "subjectId", + "subjectType" + ] + }, + "UpdateMembersRequestDto": { + "type": "object", + "description": "Bulk grant, update, and revoke operations for resource members", + "properties": { + "grant": { + "type": "array", + "description": "Members to grant new access to", + "items": { + "$ref": "#/components/schemas/MemberGrantDto" + } + }, + "update": { + "type": "array", + "description": "Members whose existing role should be changed", + "items": { + "$ref": "#/components/schemas/MemberGrantDto" + } + }, + "revoke": { + "type": "array", + "description": "Members to revoke all access from", + "items": { + "$ref": "#/components/schemas/MemberRevokeDto" + } + }, + "inheritViewOnly": { + "type": "boolean", + "description": "Set inheritance for a record-type (true=inherited, false=view-only). Only valid for record-types." + }, + "wildcard": { + "type": "string", + "description": "Set wildcard access mode for a record. Only valid for records.", + "enum": [ + "SELECTED_USERS_ONLY", + "EVERYONE_IN_WORKSPACE" + ] + } + } + }, + "CursorInfo": { + "type": "object", + "description": "Cursor pagination metadata", + "properties": { + "nextCursor": { + "type": "string", + "description": "Opaque cursor for fetching the next page. Absent when there are no more pages.", + "example": "UnQ2OWIxNGY3ZTBlMzhmMzVmMjhjM2NjZWU=" + }, + "hasMore": { + "type": "boolean", + "description": "Whether more items exist beyond this page" + } + } + }, + "CursorResponseWorkspaceDto": { + "type": "object", + "description": "Cursor-paginated list of workspaces", + "properties": { + "content": { + "type": "array", + "description": "List of workspaces in the current page", + "items": { + "$ref": "#/components/schemas/WorkspaceBaseDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "CursorResponseRecordTypeDto": { + "type": "object", + "description": "Cursor-paginated list of record types", + "properties": { + "content": { + "type": "array", + "description": "List of record types in the current page", + "items": { + "$ref": "#/components/schemas/RecordTypeBaseDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "CellValueDto": { + "type": "object", + "description": "A snapshot of a field value at a point in time", + "properties": { + "value": { + "description": "The stored value of the field at the time of the change" + }, + "fieldSnapshot": { + "$ref": "#/components/schemas/FieldSnapshotDto", + "description": "Snapshot of the field metadata at the time of the change" + } + } + }, + "CursorResponseHistoryEntryDto": { + "type": "object", + "description": "Cursor-paginated list of history entries", + "properties": { + "content": { + "type": "array", + "description": "List of history entries in the current page", + "items": { + "$ref": "#/components/schemas/HistoryEntryDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "FieldSnapshotDto": { + "type": "object", + "description": "Snapshot of field metadata captured at the time of the change", + "properties": { + "id": { + "type": "string", + "description": "ID of the field" + }, + "type": { + "type": "string", + "description": "Type of the field" + }, + "displayName": { + "type": "string", + "description": "Display name of the field" + }, + "description": { + "type": "string", + "description": "Description of the field" + }, + "hasError": { + "type": "boolean", + "description": "Whether the field has a configuration error" + }, + "options": { + "type": "array", + "description": "Options for single-select or multi-select fields", + "items": { + "$ref": "#/components/schemas/FieldOptionDto" + } + }, + "dateOptions": { + "$ref": "#/components/schemas/FieldDateOptionsDto", + "description": "Date-specific configuration options" + }, + "numberOptions": { + "$ref": "#/components/schemas/FieldNumberOptionsDto", + "description": "Number-specific configuration options" + }, + "userOptions": { + "$ref": "#/components/schemas/FieldUserOptionsDto", + "description": "User-specific configuration options" + } + } + }, + "HistoryEntryDto": { + "type": "object", + "description": "A single record field change event", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of this history entry" + }, + "recordId": { + "type": "string", + "description": "ID of the record this change belongs to" + }, + "createdBy": { + "type": "string", + "description": "ID of the user who made the change" + }, + "createdAt": { + "type": "string", + "description": "ISO-8601 timestamp of when the change occurred", + "example": "2026-01-15T10:30:00.000Z" + }, + "fieldId": { + "type": "string", + "description": "ID of the field that changed" + }, + "before": { + "$ref": "#/components/schemas/CellValueDto", + "description": "Field state before the change" + }, + "after": { + "$ref": "#/components/schemas/CellValueDto", + "description": "Field state after the change" + } + } + }, + "CursorResponseViewDto": { + "type": "object", + "description": "Cursor-paginated list of views", + "properties": { + "content": { + "type": "array", + "description": "List of views in the current page", + "items": { + "$ref": "#/components/schemas/ViewDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "CursorResponseFieldDto": { + "type": "object", + "description": "Cursor-paginated list of fields", + "properties": { + "content": { + "type": "array", + "description": "List of fields in the current page", + "items": { + "$ref": "#/components/schemas/FieldDto" + } + }, + "cursor": { + "$ref": "#/components/schemas/CursorInfo", + "description": "Cursor metadata for fetching subsequent pages" + } + } + }, + "PermissionDto": { + "type": "object", + "description": "Current user's effective permissions on a resource", + "properties": { + "canView": { + "type": "boolean", + "description": "Whether the user can view this resource" + }, + "canEdit": { + "type": "boolean", + "description": "Whether the user can edit this resource" + }, + "canDelete": { + "type": "boolean", + "description": "Whether the user can delete this resource" + }, + "canAdd": { + "type": "boolean", + "description": "Whether the user can add items to this resource" + } + } + }, + "AccessRequestDto": { + "type": "object", + "description": "A pending access request for a resource", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the access request" + }, + "message": { + "type": "string", + "description": "Optional message from the requester" + }, + "requester": { + "$ref": "#/components/schemas/RequesterDto", + "description": "User who submitted the request" + } + } + }, + "RequesterDto": { + "type": "object", + "description": "The user who submitted an access request", + "properties": { + "id": { + "type": "string", + "description": "User's external identifier" + }, + "name": { + "type": "string", + "description": "User's display name" + }, + "email": { + "type": "string", + "description": "User's email address" + } + } + }, + "MemberPermissionDto": { + "type": "object", + "description": "A subject (user, group, team, role, or company) with a role on a resource", + "properties": { + "subjectId": { + "type": "string", + "description": "ID of the subject" + }, + "subjectType": { + "type": "string", + "description": "Type of the subject", + "enum": [ + "user", + "group", + "team", + "role", + "company" + ] + }, + "name": { + "type": "string", + "description": "Display name of the subject" + }, + "avatarUrl": { + "type": "string", + "description": "Avatar URL of the subject, if available" + }, + "role": { + "type": "string", + "description": "Role of the subject on this resource", + "enum": [ + "viewer", + "editor", + "manager" + ] + } + } + }, + "InheritanceDto": { + "type": "object", + "description": "Workspace-member inheritance setting for a record type", + "properties": { + "inherited": { + "type": "boolean", + "description": "When true, workspace members inherit their workspace-level access on this record type. When false, workspace members are restricted to view-only." + } + } + }, + "BulkDeleteRequestDto": { + "type": "object", + "description": "List of record IDs to delete", + "properties": { + "ids": { + "type": "array", + "description": "List of record IDs to delete (max 100)", + "example": [ + "r1", + "r2" + ], + "items": { + "type": "string" + }, + "maxItems": 100, + "minItems": 0 + } + }, + "required": [ + "ids" + ] + }, + "DeleteAccessRequestsDto": { + "type": "object", + "description": "Request body for dismissing access requests", + "properties": { + "requestIds": { + "type": "array", + "description": "IDs of access requests to dismiss", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "required": [ + "requestIds" + ] + } + } + } +} \ No newline at end of file