Atomicwork requests API
The requests API from Atomicwork — 19 operation(s) for requests.
The requests API from Atomicwork — 19 operation(s) for requests.
openapi: 3.1.0
info:
title: Atomicwork Public accessManagement requests API
version: 1.0.0
servers:
- url: https://{tenant}.atomicwork.com
description: Your Atomicwork tenant
tags:
- name: requests
paths:
/api/v1/requests:
post:
operationId: postapi-v-1-requests
summary: Create request
tags:
- requests
parameters:
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
request_type:
type: string
request_source:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaRequestSource'
description:
type: string
email_content:
type: string
plain_text_description_override:
type: string
description: 'Internal-only override for the persisted plain-text rendering of the description. When non-empty, AbstractRequestService persists it as RequestDetail.description instead of running HTMLSanitizerUtil.getPlainText() on the HTML description.
Set ONLY by the email ingestion path (EmailIntentBasedRequestCreationService), which derives it from reqDescription via normalizeHtmlToPlainText(getPlainTextForRichHtml(...)) so system-generated HTML emails (BlackLine offboarding, etc.) avoid mashed table cells and blank-line storms.
Annotated @JsonIgnore so external HTTP clients cannot set it via the request body — without that annotation, any caller of POST /requests, /service-requests, /incidents could write arbitrary unsanitized text into RequestDetail.description, bypassing the getPlainText() pipeline. The Lombok @SuperBuilder still exposes a setter for in-process Java callers (the email path), since builder access does not go through Jackson.
'
status:
type: string
priority:
type: string
parent_request_id:
type: integer
format: int64
agent_group:
type: integer
format: int64
assignee:
type: integer
format: int64
subject:
type: string
notes:
type: array
items:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaNotesItems'
workspace_id:
type: integer
format: int64
conversation_info:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaConversationInfo'
tags:
type: array
items:
type: integer
format: int64
cc_emails:
type: array
items:
type: string
bcc_emails:
type: array
items:
type: string
attachments:
type: array
items:
type: integer
format: int64
requester:
type: integer
format: int64
to_email:
type: string
request_created_from:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaRequestCreatedFrom'
custom_fields:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaCustomFields'
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
external_id:
type: string
external_source:
$ref: '#/components/schemas/ApiV1RequestsPostRequestBodyContentApplicationJsonSchemaExternalSource'
resolution_time:
type: string
format: date-time
description: 'When the ticket was resolved in the source system. Only accepted during migration (requires external_id or external_source).
'
first_response_time:
type: string
format: date-time
description: 'When the first agent response occurred in the source system. Only accepted during migration (requires external_id or external_source).
'
first_response_due_time:
type: string
format: date-time
description: 'SLA due time for first response from the source system. Only accepted during migration (requires external_id or external_source).
'
resolution_due_time:
type: string
format: date-time
description: 'SLA due time for resolution from the source system. Only accepted during migration (requires external_id or external_source).
'
closed_status_at:
type: string
format: date-time
description: 'When the ticket was moved to closed status in the source system. Only accepted during migration (requires external_id or external_source). When provided with a closed status, also sets resolution_time if not explicitly provided.
'
/api/v1/requests/bulk-actions/{bulk_action_type}:
post:
operationId: postapi-v-1-requests-bulk-actions-bulk-action-type
summary: Bulk action on requests
tags:
- requests
parameters:
- name: bulk_action_type
in: path
description: The bulk action type
required: true
schema:
$ref: '#/components/schemas/ApiV1RequestsBulkActionsBulkActionTypePostParametersBulkActionType'
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests_bulk_actions__bulk_action_type_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
display_ids:
type: array
items:
type: string
assignee:
type: string
tags:
type: array
items:
type: integer
format: int64
option_label:
type: string
sub_option_label:
type: string
all_children:
type: boolean
major_incident_display_id:
type: string
/api/v1/requests/list:
post:
operationId: postapi-v-1-requests-list
summary: Get requests by filter
description: "\n### Filtering\n\nThe request body is an **array of filter objects**. Send an empty array (`[]`) to retrieve all records.\n\nEach filter object has the following fields:\n\n| Field | Type | Description |\n|---|---|---|\n| `attribute` | string | The field to filter on (see Supported attributes below) |\n| `operator` | string | Comparison operator (see Available operators below) |\n| `values` | array | One or more `{ \"value\": <scalar> }` objects |\n\n**Supported attributes**\n\n| Attribute | Typical operator | Description |\n|---|---|---|\n| `status` | `IS_ANY_OF` | Ticket status (e.g. `OPEN`, `IN_PROGRESS`, `RESOLVED`, `CLOSED`). |\n| `type` | `IS_ANY_OF` | Request type (e.g. `INCIDENT`, `SERVICE_REQUEST`, `GENERAL_REQUEST`). |\n| `assignee_id` | `IS_ANY_OF` | Assigned agent user ID. |\n| `requester_id` | `IS_ANY_OF` | Requester user ID. |\n| `created_at` | `IS_BETWEEN` | Creation timestamp (ISO 8601). Use for date range filtering. |\n| `updated_at` | `IS_BETWEEN` | Last-updated timestamp (ISO 8601). |\n\n**Available operators**\n\n| Operator | Meaning |\n|---|---|\n| `EQUALS` | Exact match |\n| `NOT_EQUALS` | Exclude exact match |\n| `IN` / `IS_ANY_OF` | Match any value in the list |\n| `IS_NOT_ANY_OF` | Exclude all listed values |\n| `IS_BETWEEN` | Inclusive range — pass exactly two values: `[start, end]` |\n| `IS_ON_OR_BEFORE` / `IS_ON_OR_AFTER` | Date/time boundary comparisons |\n| `CONTAINS` / `TEXT_CONTAINS` | Substring or set membership |\n| `IS_NULL` / `IS_NOT_NULL` | Null checks — `values` array can be empty |\n| `STARTS_WITH` / `ENDS_WITH` | String prefix/suffix match |\n\n**Example**\n\n```json\n[\n {\n \"attribute\": \"status\",\n \"operator\": \"IS_ANY_OF\",\n \"values\": [\n {\n \"value\": \"OPEN\"\n },\n {\n \"value\": \"IN_PROGRESS\"\n }\n ]\n },\n {\n \"attribute\": \"created_at\",\n \"operator\": \"IS_BETWEEN\",\n \"values\": [\n {\n \"value\": \"2024-01-01T00:00:00Z\"\n },\n {\n \"value\": \"2024-12-31T23:59:59Z\"\n }\n ]\n }\n]\n```\n"
tags:
- requests
parameters:
- name: filter_name
in: query
description: ''
required: true
schema:
type: string
- name: sort_order
in: query
description: ''
required: false
schema:
$ref: '#/components/schemas/ApiV1RequestsListPostParametersSortOrder'
- name: sort
in: query
description: Generic ordered sort as a compact string, e.g. `created_at:ASC,subject:DESC`. Field keys are validated server-side against the view-column allowlist. When present, takes precedence over the legacy `sort_order` enum.
required: false
schema:
type: string
- name: page
in: query
description: ''
required: true
schema:
type: integer
default: 1
- name: per_page
in: query
description: ''
required: false
schema:
type: integer
default: 25
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests_list_Response_200'
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiV1RequestsListPostRequestBodyContentApplicationJsonSchemaItems'
/api/v1/workspaces/{workspace_id}/requests/list:
post:
operationId: postapi-v-1-workspaces-workspace-id-requests-list
summary: Get requests by filter
description: "\n### Filtering\n\nThe request body is an **array of filter objects**. Send an empty array (`[]`) to retrieve all records.\n\nEach filter object has the following fields:\n\n| Field | Type | Description |\n|---|---|---|\n| `attribute` | string | The field to filter on (see Supported attributes below) |\n| `operator` | string | Comparison operator (see Available operators below) |\n| `values` | array | One or more `{ \"value\": <scalar> }` objects |\n\n**Supported attributes**\n\n| Attribute | Typical operator | Description |\n|---|---|---|\n| `status` | `IS_ANY_OF` | Ticket status (e.g. `OPEN`, `IN_PROGRESS`, `RESOLVED`, `CLOSED`). |\n| `type` | `IS_ANY_OF` | Request type (e.g. `INCIDENT`, `SERVICE_REQUEST`, `GENERAL_REQUEST`). |\n| `assignee_id` | `IS_ANY_OF` | Assigned agent user ID. |\n| `requester_id` | `IS_ANY_OF` | Requester user ID. |\n| `created_at` | `IS_BETWEEN` | Creation timestamp (ISO 8601). Use for date range filtering. |\n| `updated_at` | `IS_BETWEEN` | Last-updated timestamp (ISO 8601). |\n\n**Available operators**\n\n| Operator | Meaning |\n|---|---|\n| `EQUALS` | Exact match |\n| `NOT_EQUALS` | Exclude exact match |\n| `IN` / `IS_ANY_OF` | Match any value in the list |\n| `IS_NOT_ANY_OF` | Exclude all listed values |\n| `IS_BETWEEN` | Inclusive range — pass exactly two values: `[start, end]` |\n| `IS_ON_OR_BEFORE` / `IS_ON_OR_AFTER` | Date/time boundary comparisons |\n| `CONTAINS` / `TEXT_CONTAINS` | Substring or set membership |\n| `IS_NULL` / `IS_NOT_NULL` | Null checks — `values` array can be empty |\n| `STARTS_WITH` / `ENDS_WITH` | String prefix/suffix match |\n\n**Example**\n\n```json\n[\n {\n \"attribute\": \"status\",\n \"operator\": \"IS_ANY_OF\",\n \"values\": [\n {\n \"value\": \"OPEN\"\n },\n {\n \"value\": \"IN_PROGRESS\"\n }\n ]\n },\n {\n \"attribute\": \"created_at\",\n \"operator\": \"IS_BETWEEN\",\n \"values\": [\n {\n \"value\": \"2024-01-01T00:00:00Z\"\n },\n {\n \"value\": \"2024-12-31T23:59:59Z\"\n }\n ]\n }\n]\n```\n"
tags:
- requests
parameters:
- name: workspace_id
in: path
description: Workspace ID (numeric). Find yours under Settings → Workspace.
required: true
schema:
type: integer
format: int64
- name: filter_name
in: query
description: ''
required: true
schema:
type: string
- name: is_problem
in: query
description: ''
required: false
schema:
type: boolean
- name: sort_order
in: query
description: ''
required: false
schema:
$ref: '#/components/schemas/ApiV1WorkspacesWorkspaceIdRequestsListPostParametersSortOrder'
- name: sort
in: query
description: Generic ordered sort as a compact string, e.g. `priority:DESC,created_at:ASC`. Field keys are validated server-side against the view-column allowlist. When present, takes precedence over the legacy `sort_order` enum.
required: false
schema:
type: string
- name: page
in: query
description: ''
required: true
schema:
type: integer
default: 1
- name: per_page
in: query
description: ''
required: false
schema:
type: integer
default: 25
- name: request_type_filter
in: query
description: ''
required: false
schema:
type: array
items:
$ref: '#/components/schemas/ApiV1WorkspacesWorkspaceIdRequestsListPostParametersRequestTypeFilterSchemaItems'
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_workspaces__workspace_id__requests_list_Response_200'
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiV1WorkspacesWorkspaceIdRequestsListPostRequestBodyContentApplicationJsonSchemaItems'
/api/v1/requests/{requestId}:
get:
operationId: getapi-v-1-requests-request-id
summary: Get Request
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_getapi_v1_requests__requestId_Response_200'
patch:
operationId: patchapi-v-1-requests-request-id
summary: Patch request
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_patchapi_v1_requests__requestId_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties: {}
/api/v1/requests/{requestId}/move:
post:
operationId: postapi-v-1-requests-request-id-move
summary: Move Request
description: '**DEPRECATED**: Use `/requests/{requestId}/move/result` instead.
This endpoint does not handle permission-based responses correctly when the user
lacks view access to the destination workspace.
'
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests__requestId__move_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
destination_workspace_id:
type: integer
format: int64
request_note:
$ref: '#/components/schemas/ApiV1RequestsRequestIdMovePostRequestBodyContentApplicationJsonSchemaRequestNote'
workflow_request_note:
$ref: '#/components/schemas/ApiV1RequestsRequestIdMovePostRequestBodyContentApplicationJsonSchemaWorkflowRequestNote'
data:
$ref: '#/components/schemas/ApiV1RequestsRequestIdMovePostRequestBodyContentApplicationJsonSchemaData'
/api/v1/requests/{requestId}/modify-followers:
put:
operationId: putapi-v-1-requests-request-id-modify-followers
summary: Add or Remove Followers
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_putapi_v1_requests__requestId__modify_followers_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
follower_ids:
type: array
items:
type: integer
format: int64
/api/v1/requests/{requestId}/followers:
get:
operationId: getapi-v-1-requests-request-id-followers
summary: Get Followers of a Request
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_getapi_v1_requests__requestId__followers_Response_200'
/api/v1/requests/{requestId}/add-followers:
patch:
operationId: patchapi-v-1-requests-request-id-add-followers
summary: Add Followers to a Request
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_patchapi_v1_requests__requestId__add_followers_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
follower_ids:
type: array
items:
type: integer
format: int64
/api/v1/requests/{requestId}/trash:
put:
operationId: putapi-v-1-requests-request-id-trash
summary: Trash Request
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_putapi_v1_requests__requestId__trash_Response_200'
/api/v1/requests/{requestId}/notes:
get:
operationId: getapi-v-1-requests-request-id-notes
summary: Get Request Notes
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: search_key
in: query
description: ''
required: false
schema:
type: string
- name: page
in: query
description: ''
required: true
schema:
type: integer
default: 1
- name: per_page
in: query
description: ''
required: false
schema:
type: integer
default: 25
- name: next_page_token
in: query
description: ''
required: false
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_getapi_v1_requests__requestId__notes_Response_200'
post:
operationId: postapi-v-1-requests-request-id-notes
summary: Create request notes
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests__requestId__notes_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
user_id:
type: integer
format: int64
conversation_id:
type: integer
format: int64
description: When set, the reply is mirrored into this conversation's thread (UAG).
description:
type: string
mentions:
type: array
items:
type: integer
format: int64
is_private:
type: boolean
default: false
source:
$ref: '#/components/schemas/ApiV1RequestsRequestIdNotesPostRequestBodyContentApplicationJsonSchemaSource'
type:
$ref: '#/components/schemas/ApiV1RequestsRequestIdNotesPostRequestBodyContentApplicationJsonSchemaType'
attachments:
type: array
items:
type: integer
format: int64
cc_emails:
type: array
items:
type: string
bcc_emails:
type: array
items:
type: string
is_broadcast:
type: boolean
default: false
external_id:
type: string
external_source_type:
$ref: '#/components/schemas/ApiV1RequestsRequestIdNotesPostRequestBodyContentApplicationJsonSchemaExternalSourceType'
email_content:
type: string
event_created_at:
type: string
format: date-time
description: Event creation timestamp. When provided via public API, also backdates the note's created time, SLA metrics, and activity timestamps. Must not be in the future or before the request's creation time.
/api/v1/requests/{requestId}/activity-notes:
get:
operationId: getapi-v-1-requests-request-id-activity-notes
summary: Get Request Notes and activities
tags:
- requests
parameters:
- name: requestId
in: path
description: ''
required: true
schema:
type: string
- name: search_key
in: query
description: ''
required: false
schema:
type: string
- name: page
in: query
description: ''
required: true
schema:
type: integer
default: 1
- name: per_page
in: query
description: ''
required: false
schema:
type: integer
default: 25
- name: next_page_token
in: query
description: ''
required: false
schema:
type: string
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_getapi_v1_requests__requestId__activity_notes_Response_200'
/api/v1/requests/items/{item_id}:
post:
operationId: postapi-v-1-requests-items-item-id
summary: Create service request for item
tags:
- requests
parameters:
- name: item_id
in: path
description: The item ID
required: true
schema:
type: integer
format: int64
- name: X-Api-Key
in: header
required: true
schema:
type: string
- name: X-Workspace-Id
in: header
required: false
schema:
type: string
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/Requests_postapi_v1_requests_items__item_id_Response_200'
requestBody:
content:
application/json:
schema:
type: object
properties:
request_type:
type: string
request_source:
$ref: '#/components/schemas/ApiV1RequestsItemsItemIdPostRequestBodyContentApplicationJsonSchemaRequestSource'
description:
type: string
email_content:
type: string
plain_text_description_override:
type: string
description: 'Internal-only override for the persisted plain-text rendering of the description. When non-empty, AbstractRequestService persists it as RequestDetail.description instead of running HTMLSanitizerUtil.getPlainText() on the HTML description.
Set ONLY by the email ingestion path (EmailIntentBasedRequestCreationService), which derives it from reqDescription via normalizeHtmlToPlainText(getPlainTextForRichHtml(...)) so system-generated HTML emails (BlackLine offboarding, etc.) avoid mashed table cells and blank-line storms.
Annotated @JsonIgnore so external HTTP clients cannot set it via the request body — without that annotation, any caller of POST /requests, /service-requests, /incidents could write arbitrary unsanitized text into RequestDetail.description, bypassing the getPlainText() pipeline. The Lombok @SuperBuilder still exposes a setter for in-process Java callers (the email path), since builder access does not go through Jackson.
'
status:
type: string
priority:
type: string
parent_request_id:
type: integer
format: int64
agent_group:
type: integer
format: int64
assignee:
type: integer
format: int64
subject:
type: string
notes:
type: array
items:
$ref: '#/components/schemas/ApiV1RequestsItemsItemIdPostRequestBodyContentApplicationJsonSchemaNotesItems'
workspace_id:
type: integer
format: int64
conversation_info:
$ref: '#/components/schemas/ApiV1RequestsItemsItemIdPostRequestBodyContentApplicationJsonSchemaConversationInfo'
tags:
type: array
items:
type: integer
format: int64
cc_emails:
type: array
items:
type: strin
# --- truncated at 32 KB (103 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/atomicwork/refs/heads/main/openapi/atomicwork-requests-api-openapi.yml