PlanRadar DMS API

Document Management System: browse, manage and copy DMS nodes, ticket attachments and form-field attachments

Operations 44

GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes Retrieves All nodes [folder|files] for a specific projects
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes Create New Node[folder] or a new file
PATCH /api/v2/{customer_id}/projects/{project_id}/dms/nodes execute a bulk update action
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments/{ticket_uuid} Create New Ticket Attachment
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/{ticket_uuid} Create New Form Field Attachment
PATCH /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/{id} Update a Form Field Attachment
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments Retrieves All ticket attachments files for a specific projects
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments Retrieves all form field attachments for a specific project
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments/delete Delete Ticket Attachment
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/delete Delete Form Field Attachment
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/attachments Retrieves all attachments (ticket + form field) for a specific project
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/attachments/delete Delete attachments (ticket or form field)
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id} show node[folder] or file details
PATCH /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id} update node[folder] or file
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id} mark node[folder] or file as deleted
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/copy create another copy under different folder for a file/folder
PUT /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/trash move file or folder to the trash bin
PUT /api/v2/{customer_id}/projects/{project_id}/dms/nodes/trash execute a bulk trash
PUT /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/restore restore file/folder from trash bin
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/copy execute a bulk copy , this is only works with files !
PUT /api/v2/{customer_id}/projects/{project_id}/dms/nodes/restore execute a bulk restore
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/delete execute bulk delete
PATCH /api/v2/:customer_id/projects/:project_id/dms/nodes/:id/toggle toggle the control access switch
PATCH /api/v2/:customer_id/projects/:project_id/dms/nodes/:id/restore_permissions restore permissions
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/copy_to_tickets_validation validate before copying files to tickets
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/copy_attachments_to_dms_validation validate before copying ticket attachments to DMS
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/copy_attachments_to_dms copy ticket attachments to DMS
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/copy_to_tickets validate before copying files to tickets
GET /api/v2/{customer_id}/projects/{project_id}/dms/bookmarks Retrieves All the bookmarks for a user
POST /api/v2/{customer_id}/projects/{project_id}/dms/bookmarks Create New bookmark
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/bookmarks/{bookmark_id} delete bookmark
GET /api/v2/{customer_id}/projects/{project_id}/dms/sidebar_sections Retrieves DMS sections
GET /api/v2/{customer_id}/projects/{project_id}/dms/logs/{item_type}/{item_id} Retrieves DMS activity logs
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/files_size Retrieves DMS files size for a specific project
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/versions upload new version of the file attachment
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/versions load the file attachment version
DELETE /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/versions/{id} delete file attachment version
GET /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/versions/{id} load file attachment version details
POST /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}/versions/{id}/restore Restore file attachment version
GET /api/v2/:customer_id/projects/:project_id/dms/nodes/:node_id/permissions Retrieves All permissions for a specific node
POST /api/v2/:customer_id/projects/:project_id/dms/nodes/:node_id/permissions create a permission entry for a specific role|user to access specific node
DELETE /api/v2/:customer_id/projects/:project_id/dms/nodes/:node_id/permissions/:id delete access permission for the list
PUT /api/v2/:customer_id/projects/:project_id/dms/nodes/:node_id/permissions/:id update access|permission type for a permission
GET /api/v2/:customer_id/projects/:project_id/dms/nodes/list_roles_and_users list roles and users

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/planradar-dms-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

planradar-dms-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: PlanRadar's API Documentation Approval Requests V2 DMS API
  version: '2.0'
  description: "Welcome to PlanRadar's API documentation, here you can find all the details about our APIs as well as test them online.<br />\n        <h5>Rate Limits</h5>30 requests per minute per account, aggregated across all tokens.<br />\n        If the threshold is exceeded, a 5-minute cooldown is applied to the account, aggregated across all tokens.<br />\n        During the cooldown period, further requests may be rejected until the cooldown ends.<br />\n        In rare cases, an endpoint may have a different rate limit than the default. When that happens, the differing limit will be explicitly stated in the API documentation for that endpoint.<br />\n        <h5>Access Key</h5>In order to be able to access any API you have to create an access token.Therefore you have to follow these steps:-\n        <ul>\n          <li>Go to your profile page and click on Personal Access Tokens on the left side bar</li><li>Click on the 'Create Access Token' top right button in order to create a new access token.</li><li>Copy the created token and paste it into the field that pops up when you click on the 'Authorize' button </li><li>Note: you can copy the token only once.</li><li>Now you can easily access any API</li>\n        </ul>\n        <h5>V2 APIs</h5>We are currently working on upgrading all our APIs to v2, and we recommend that you use v2 APIs if it is available.\n        <p>V2 APIs are faster, robust and more flexible than v1 APIs</p>"
servers:
- url: /
tags:
- name: DMS
  description: 'Document Management System: browse, manage and copy DMS nodes, ticket attachments and form-field attachments'
paths:
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes:
    get:
      summary: Retrieves All nodes [folder|files] for a specific projects
      tags:
      - DMS
      security:
      - apiKey: []
      description: list all the nodes
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: pagesize
        in: query
        schema:
          type: string
      - name: page
        in: query
        schema:
          type: string
      - name: sort
        in: query
        description: 'Sort field. Supports: file_attachment_versions.last_modified_at, -file_attachment_versions.last_modified_at (uses COALESCE with created_at as fallback)'
        schema:
          type: string
      - name: parent_id
        in: query
        schema:
          type: string
      - name: only_folders
        in: query
        schema:
          type: string
      - name: folder_on_top
        in: query
        description: default = true
        schema:
          type: string
      - name: trashed
        in: query
        description: true|false
        schema:
          type: string
      - name: exclude_ticket_documents
        in: query
        description: true|false
        schema:
          type: string
      - name: search
        in: query
        description: search for a specific file
        schema:
          type: string
      - name: filter
        in: query
        description: "\n        * to load all the files and folder under specific parent -> parent_id=uuid,\n        * to load folder or files on the root level no need for query params,\n        * to load the items in the trash bin which are on the root level  ?trashed=true\n        * version.last-modified-at: filter by last modified date (date type, supports ge/le/between/has/has_not). Uses COALESCE(last_modified_at, created_at) for comparison."
        schema:
          type: string
      - name: search_in_all_folders
        in: query
        description: true|false default value is false if set true this will load all the files and folders in the project
        schema:
          type: string
      - name: search_in_all_subfolders
        in: query
        description: true|false default value is false if set true this will load all the dms nodes scoped by a specific parent, if no parent_id provided it will just work like search_in_all_folders
        schema:
          type: string
      - name: show_virtual
        in: query
        description: true|false default value is false if set true this will load all the components and legacy documents
        schema:
          type: string
      - name: bookmarked
        in: query
        description: true|false default value is false if set true this will load all bookmarked node on specific level other wise search_in_all_subfoldrs should be provided as well to load all the bookmarked nodes by this user
        schema:
          type: string
      - name: flat_files_list
        in: query
        description: 'true|false default value is false if set true this will load all files for a specific folder and subfolders if no parent_id is provided it will load all the files in all folders including the root '
        schema:
          type: string
      - name: last_sync_date
        in: query
        description: is a Unix Timestamp. If it is set, only nodes that were updated after that timestamp will be returned
        schema:
          type: string
      - name: filter_by_edit_permissions
        in: query
        description: true|false default value is false. If set true the listing is scoped to nodes the current user may copy into (folders / DMS root they can write to) — used by the copy-attachments-to-DMS destination picker.
        schema:
          type: string
      responses:
        '404':
          description: nodes not found
    post:
      summary: Create New Node[folder]  or a new file
      tags:
      - DMS
      security:
      - apiKey: []
      description: "Create new Node or file. Maximum file size: 100MB for regular uploads, 2GB when using chunking technique.\n\nFor files larger than 100MB, use the chunking technique:\n\n1. Split the file into chunks (recommended: 15MB per chunk)\n2. Upload each chunk to: POST /api/v2/{customer_id}/file_uploads/upload_chunk\n   Required parameters (FormData):\n   - data[attributes][file]: The chunk blob\n   - data[attributes][file-id]: Unique file ID (format: customer_id.uuid.filename)\n   - data[attributes][original-filename]: Original file name\n   - data[attributes][part]: Chunk number (starting from 1)\n   - data[attributes][uuid]: Unique UUID for each chunk\n   \n3. After all chunks are uploaded, merge them: POST /api/v2/{customer_id}/file_uploads/confirm_upload\n   Required parameters (FormData):\n   - data[attributes][file-id]: The same file ID used during chunk upload\n   - data[attributes][uuid]: A unique UUID for the merge request\n   - data[attributes][original-filename]: Original file name\n   \n4. Use the returned file-path or file-url in the DMS nodes creation request\n\nJavaScript Example:\n```javascript\n// Helper function to generate UUID\nfunction uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n    const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n    return v.toString(16);\n  });\n}\n\n// Step 1: Initialize chunking parameters\nconst CHUNK_SIZE = 15 * 1024 * 1024; // 15MB\nconst file = document.querySelector('input[type=\"file\"]').files[0];\nconst totalChunks = Math.ceil(file.size / CHUNK_SIZE);\nconst fileId = `${customerId}.${uuidv4()}.${file.name.replace(/\\s|\\(|\\)/g, '')}`;\nconst mergeUuid = uuidv4();\n\n// Step 2: Upload each chunk sequentially\nfor (let i = 0; i < totalChunks; i++) {\n  const start = i * CHUNK_SIZE;\n  const end = Math.min(start + CHUNK_SIZE, file.size);\n  const chunk = file.slice(start, end);\n  \n  const formData = new FormData();\n  formData.append('data[attributes][file]', chunk);\n  formData.append('data[attributes][file-id]', fileId);\n  formData.append('data[attributes][original-filename]', file.name);\n  formData.append('data[attributes][part]', i + 1);\n  formData.append('data[attributes][uuid]', uuidv4());\n  \n  const response = await fetch(`/api/v2/${customerId}/file_uploads/upload_chunk`, {\n    method: 'POST',\n    headers: { 'Authorization': `Bearer ${apiKey}` },\n    body: formData\n  });\n  \n  if (!response.ok) {\n    throw new Error(`Chunk ${i + 1} upload failed`);\n  }\n}\n\n// Step 3: Merge all chunks\nconst mergeFormData = new FormData();\nmergeFormData.append('data[attributes][file-id]', fileId);\nmergeFormData.append('data[attributes][uuid]', mergeUuid);\nmergeFormData.append('data[attributes][original-filename]', file.name);\n\nconst mergeResponse = await fetch(`/api/v2/${customerId}/file_uploads/confirm_upload`, {\n  method: 'POST',\n  headers: { 'Authorization': `Bearer ${apiKey}` },\n  body: mergeFormData\n});\n\nconst mergeData = await mergeResponse.json();\nconst filePath = mergeData.data.attributes['file-path'];\nconst fileUrl = mergeData.data.attributes['file-url'];\n\n// Step 4: Create DMS node with the uploaded file\nconst dmsFormData = new FormData();\ndmsFormData.append('data[attributes][name]', file.name);\ndmsFormData.append('data[attributes][file][link]', filePath);\ndmsFormData.append('data[attributes][file][name]', file.name);\ndmsFormData.append('data[attributes][file][file-content-type]', file.type);\n\nconst dmsResponse = await fetch(`/api/v2/${customerId}/projects/${projectId}/dms/nodes`, {\n  method: 'POST',\n  headers: { 'Authorization': `Bearer ${apiKey}` },\n  body: dmsFormData\n});\n\nconst dmsNode = await dmsResponse.json();\nconsole.log('DMS Node created:', dmsNode);\n```\n"
      x-websocket-response:
        channel: customer_{customerId}
        message_type: dms_log_created
        payload:
          type: object
          description: ActivityLog entry broadcast when a node (file/folder) is created
          properties:
            node_ids:
              type: array
              items:
                type: string
              description: Encoded node IDs
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      responses:
        '404':
          description: node Errors
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                data[attributes][parent_id]:
                  type: string
                  description: the parent of the created folder
                data[attributes][file]:
                  type: string
                  description: file must contain form fields or in case of remote_url the link can be used instead. For chunked uploads, use data[attributes][file][link] with the file path returned from confirm_upload
                  format: binary
                data[attributes][type]:
                  type: string
                  description: 'service type of the file in case of Google drive type must be google_drive "optional" '
                data[attributes][token]:
                  type: string
                  description: this is for google drive api
                data[attributes][file_content_type]:
                  type: string
                  description: the type of the file ex text/plain and this is has to be use with google drive services
                data[attributes][name]:
                  type: string
                  description: is required, name of the file or folder
                data[attributes][run_id]:
                  type: string
                  description: optional correlation UUID stored on the created file version's metadata and returned verbatim under the file's file_data.metadata.run_id; ignored unless a valid UUID
    patch:
      summary: execute a bulk update action
      tags:
      - DMS
      security:
      - apiKey: []
      description: execute bulk update actions in bulk
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: filter
        in: query
        description: " for a single file move you will need to add a filter as query param like this ?filter[uuid][][predicate]=eq&filter[uuid][][value]=23dfg3gd23-.....\n                                                                                 and add parent_id as form data and this is will be the destination,"
        schema:
          type: string
      - name: parent_id
        in: query
        description: the id of the current folder you are in this needs to be added if you are in non root folder
        schema:
          type: string
      - name: search_in_all_folders
        in: query
        description: true|false default value is false if set true this will update all the files and folders in the project
        schema:
          type: string
      - name: search_in_all_subfolders
        in: query
        description: true|false default value is false if set true this will load all the dms nodes scoped by a specific parent, if no parent_id provided it will just work like search_in_all_folders
        schema:
          type: string
      responses:
        '404':
          description: nodes not found
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                data[attributes][parent_id]:
                  type: string
                  description: the id of the folder that you want move files or folders to or copy files or folder to
                data[attributes][name]:
                  type: string
                  description: the name which will be applied to all the updated nodes
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments/{ticket_uuid}:
    post:
      summary: Create New Ticket Attachment
      tags:
      - DMS
      security:
      - apiKey: []
      description: Create new Ticket Attachment. The response now includes <b>ticket_uuid</b> and <b>field_id</b> (if the attachment is linked to a form field) in the serialized attachment attributes.<br></br><b>Supported document types:</b> PDF, Word (doc/docx), Excel (xls/xlsx), CSV, ODS, ODT, DWG, DXF, EML, MSG, RTF, <b>ZIP, RAR</b>. Images, audio and video files are also accepted.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: ticket_uuid
        in: path
        description: the uuid of the ticket that you want to attach the file to
        required: true
        schema:
          type: string
      responses:
        '404':
          description: node Errors
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    attributes:
                      type: object
                      properties:
                        uuid:
                          type: string
                          description: unique identifier of the attachment - is optional
                        attachment:
                          type: string
                          example: data:application/zip;base64,string
                          description: 'Data URI or binary data of the attachment. Supported MIME types include images, audio, video, application/pdf, application/msword, application/vnd.ms-excel, application/zip, application/vnd.rar, application/x-rar-compressed, application/x-rar and other common document types.</br><i style="color:#9999CC"> base64 schema: data:mime_type;base64,string<i>'
                        attachment-name:
                          type: string
                          example: archive.zip
                          description: name of the attachment including extension (e.g. archive.zip, backup.rar) - required when a Data URI is sent
                        caption:
                          type: string
                          example: this is a caption
                          description: caption - is the attachment name by default but can be edited
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/{ticket_uuid}:
    post:
      summary: Create New Form Field Attachment
      tags:
      - DMS
      security:
      - apiKey: []
      description: Create new form field Attachment
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: ticket_uuid
        in: path
        description: the uuid of the ticket that you want to attach the file to
        required: true
        schema:
          type: string
      responses:
        '404':
          description: node Errors
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    attributes:
                      type: object
                      properties:
                        uuid:
                          type: string
                          description: unique identifier of the attachment - is optional
                        attachment:
                          type: string
                          example: data:image/png;base64,string
                          description: 'Data URI or binary data of the attachment</br><i style="color:#9999CC"> base64 schema: data:mime_type;base64,string<i>'
                        attachment-name:
                          type: string
                          example: image.png
                          description: name of the attachment - is required when a Data URI is sent
                        caption:
                          type: string
                          example: this is a caption
                          description: caption - is the attachment name by default but can be edited
                        field_id:
                          type: string
                          example: ft123456789
                          description: the form field id to which this attachment is linked to - is required
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/{id}:
    patch:
      summary: Update a Form Field Attachment
      tags:
      - DMS
      security:
      - apiKey: []
      description: Update an existing form field attachment (e.g. rename/caption). The attachment is looked up by its file attachment UUID or ID, not the DMS node ID.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: id
        in: path
        description: UUID or ID of the file attachment to update
        required: true
        schema:
          type: string
      responses:
        '404':
          description: Attachment not found
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    attributes:
                      type: object
                      properties:
                        name:
                          type: string
                          description: new name/caption for the attachment
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments:
    get:
      summary: Retrieves All ticket attachments files for a specific projects
      tags:
      - DMS
      security:
      - apiKey: []
      description: list all the nodes
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: pagesize
        in: query
        schema:
          type: string
      - name: page
        in: query
        schema:
          type: string
      - name: sort
        in: query
        schema:
          type: string
      - name: search
        in: query
        description: search for a specific file
        schema:
          type: string
      - name: filter
        in: query
        description: "\n        * to load all the files and folder under specific parent -> parent_id=uuid,\n        * to load folder or files on the root level no need for query params,\n        * to load the items in the trash bin which are on the root level  ?trashed=true"
        schema:
          type: string
      - name: filters
        in: query
        schema:
          type: object
          properties:
            ticket.approval-status:
              type: array
              items:
                type: object
                properties:
                  predicate:
                    type: string
                    enum:
                    - in
                    - not-in
                    - eq
                    - neq
                  value:
                    type: array
                    items:
                      type: string
                    description: 'Approval status IDs: not_started, pending, rejected, approved, approved_with_comments'
        description: "Applied filters object. Keys are field IDs from the filterable_fields endpoint (type=ticket-attachments).\n        Available ticket filter fields include: ticket.sequential-id, ticket.subject, ticket.status-id, ticket.priority-id,\n        ticket.assigned-to-id, ticket.author-id, ticket.component-id, ticket.approval-status, etc.\n        Each field value is an array of predicate/value objects."
      - name: last_sync_date
        in: query
        description: is a Unix Timestamp. If it is set, only ticket attachments that were updated after that timestamp will be returned
        schema:
          type: string
      responses:
        '404':
          description: nodes not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments:
    get:
      summary: Retrieves all form field attachments for a specific project
      tags:
      - DMS
      security:
      - apiKey: []
      description: List all form field attachments. When ticket_uuid and per_field are provided, returns a limited number of attachments per field along with field_id_counts in the response meta.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: pagesize
        in: query
        schema:
          type: string
      - name: page
        in: query
        schema:
          type: string
      - name: sort
        in: query
        schema:
          type: string
      - name: search
        in: query
        description: search for a specific file
        schema:
          type: string
      - name: field_id
        in: query
        description: the form field id to filter attachments by
        schema:
          type: string
      - name: ticket_uuid
        in: query
        description: the uuid of the ticket to filter attachments by. Required when using per_field.
        schema:
          type: string
      - name: per_field
        in: query
        description: When provided with ticket_uuid, limits the number of attachments returned per field. The response meta will include field_id_counts with the total count per field_id.
        schema:
          type: integer
      - name: filter
        in: query
        description: "\n        * to load all the files and folder under specific parent -> parent_id=uuid,\n        * to load folder or files on the root level no need for query params,\n        * to load the items in the trash bin which are on the root level  ?trashed=true"
        schema:
          type: string
      - name: filters
        in: query
        schema:
          type: object
          properties:
            ticket.approval-status:
              type: array
              items:
                type: object
                properties:
                  predicate:
                    type: string
                    enum:
                    - in
                    - not-in
                    - eq
                    - neq
                  value:
                    type: array
                    items:
                      type: string
                    description: 'Approval status IDs: not_started, pending, rejected, approved, approved_with_comments'
        description: "Applied filters object. Keys are field IDs from the filterable_fields endpoint (type=ticket-attachments).\n        Available ticket filter fields include: ticket.sequential-id, ticket.subject, ticket.status-id, ticket.priority-id,\n        ticket.assigned-to-id, ticket.author-id, ticket.component-id, ticket.approval-status, etc.\n        Each field value is an array of predicate/value objects."
      responses:
        '404':
          description: nodes not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/ticket_attachments/delete:
    delete:
      summary: Delete Ticket Attachment
      tags:
      - DMS
      security:
      - apiKey: []
      description: Delete a Ticket Attachment
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: ticket_uuid
        in: query
        description: the uuid of the ticket that you want to delete the attachment from
        schema:
          type: string
      - name: filter
        in: query
        schema:
          type: string
      - name: types
        in: query
        schema:
          type: string
      responses:
        '404':
          description: nodes not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/form_field_attachments/delete:
    delete:
      summary: Delete Form Field Attachment
      tags:
      - DMS
      security:
      - apiKey: []
      description: Delete one or more form field attachments. Uses the same delete mechanism as ticket attachments but scoped to form field attachments.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: ticket_uuid
        in: query
        description: the uuid of the ticket that the form field attachment belongs to
        schema:
          type: string
      - name: filter
        in: query
        schema:
          type: string
      - name: types
        in: query
        schema:
          type: string
      responses:
        '404':
          description: nodes not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/attachments:
    get:
      summary: Retrieves all attachments (ticket + form field) for a specific project
      tags:
      - DMS
      security:
      - apiKey: []
      description: Combined endpoint that lists both ticket attachments and form field attachments for a project. Supports the same pagination, sorting, and filtering as the ticket_attachments and form_field_attachments endpoints.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: pagesize
        in: query
        schema:
          type: string
      - name: page
        in: query
        schema:
          type: string
      - name: sort
        in: query
        schema:
          type: string
      - name: search
        in: query
        description: search for a specific file
        schema:
          type: string
      - name: ticket_uuid
        in: query
        description: filter by ticket UUID
        schema:
          type: string
      - name: only_ticket_attachments
        in: query
        description: true|false - when true, only returns ticket attachments (excludes form field attachments)
        schema:
          type: string
      - name: filter
        in: query
        schema:
          type: string
      - name: filters
        in: query
        schema:
          type: object
          properties:
            ticket.approval-status:
              type: array
              items:
                type: object
                properties:
                  predicate:
                    type: string
                    enum:
                    - in
                    - not-in
                    - eq
                    - neq
                  value:
                    type: array
                    items:
                      type: string
                    description: 'Approval status IDs: not_started, pending, rejected, approved, approved_with_comments'
        description: "Applied filters object. Keys are field IDs from the filterable_fields endpoint (type=ticket-attachments).\n        Available ticket filter fields include: ticket.sequential-id, ticket.subject, ticket.status-id, ticket.priority-id,\n        ticket.assigned-to-id, ticket.author-id, ticket.component-id, ticket.approval-status, etc.\n        Each field value is an array of predicate/value objects."
      responses:
        '404':
          description: attachments not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/attachments/delete:
    delete:
      summary: Delete attachments (ticket or form field)
      tags:
      - DMS
      security:
      - apiKey: []
      description: Combined delete endpoint that works for both ticket attachments and form field attachments.
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: ticket_uuid
        in: query
        description: the uuid of the ticket that the attachment belongs to
        schema:
          type: string
      - name: filter
        in: query
        schema:
          type: string
      - name: types
        in: query
        schema:
          type: string
      responses:
        '404':
          description: attachments not found
  /api/v2/{customer_id}/projects/{project_id}/dms/nodes/{node_id}:
    get:
      summary: show node[folder] or file details
      tags:
      - DMS
      security:
      - apiKey: []
      description: display folder/file details
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: node_id
        in: path
        get: 'the id of the node that you want to display , uuid can be used as well '
        required: true
        schema:
          type: string
      responses:
        '406':
          description: Unsupported Accept Header
    patch:
      summary: update node[folder] or file
      tags:
      - DMS
      security:
      - apiKey: []
      description: update folder/file name or move folder/file  under different folder
      parameters:
      - name: customer_id
        in: path
        required: true
        schema:
          type: string
      - name: project_id
        in: path
        required: true
        schema:
          type: string
      - name: node_id
        in: path
        description: the id of the node that you want to update uuid can be used as well
        required: true
        schema:
          type: string
      - name: show_virtual
        in: query
        description: true|false default value is false if set true this will only update the components and legacy documents, needed in case of update to these components or documents
        schema:
          type: string
      - name: mov

# --- truncated at 32 KB (68 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/planradar/refs/heads/main/openapi/planradar-dms-api-openapi.yml