{
    "openapi": "3.0.1",
    "info": {
        "title": "Atola TaskForce Web API",
        "description": "TaskForce API is based on HTTP GET requests and JSON-encoded responses.",
        "version": "2026.10.0"
    },
    "servers": [
        {
            "url": "http://TASKFORCE_IP/api"
        }
    ],
    "paths": {
        "/scan-devices": {
            "get": {
                "summary": "Get available Source drives",
                "description": "It finds drives plugged into Source ports (i. e. the ports that are currently switched to Source mode) that are not busy by other running tasks. It automatically powers up all non-powered Source devices. <p>The request returns the number of available <code>scannedSourcePorts</code> and that of <code>totalSourcePorts</code>. If <code>scannedSourcePorts</code> equals to <code>totalSourcePorts</code>, it means TaskForce powered up and checked all currently available Source ports for devices.</p> <p>Max number of Source ports: <ul><li>26 for TaskForce 2</li><li>18 for TaskForce 1</li></ul></p> <p>Turn on the Source switch to activate Source mode for that port.</p>",
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "example": {
                                    "scannedSourcePorts": 9,
                                    "totalSourcePorts": 13,
                                    "foundSourceDevices": [
                                        "SATA4 SanDisk SDSSDA120G 171108456213",
                                        "SATA2 Samsung SSD 840 PRO Series S1AXNSAF106001H",
                                        "SATA5 ST500LM012 HN-M500MBB S2RWJ9CD415935",
                                        "SAS1 DG0146BARTP HPD0 D0A2P9602JFL0923",
                                        "USB4 WDC WD10JMVW-11AJGS4 WD-WXA1AA6PTY1K"
                                    ]
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/scan-port": {
            "get": {
                "summary": "Get port status",
                "description": "<p>It powers on the specified port and identies the connected drive. If the state is <code>identifying</code>, the drive detection is still in progress. Continue polling this endpoint until the state changes to either <code>ready</code> or <code>not-detected</code>.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/scan-port?sas8</code></li> <li><code>http://TASKFORCE_IP/api/scan-port?EXT1</code></li> <li><code>http://TASKFORCE_IP/api/scan-port?SATA1&token=9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</code></li> </ul> The port identifier is expected as the first raw query item without a parameter name. Named query parameter format like <code>?portId=SATA1</code> is not supported. If <code>token</code> is used, put it after the port identifier. Returns JSON object: { state, isSource, model, serial, caseId, evidenceId } <ul> <li>state - task-progress, ready, identifying or not-detected</li> <li>isSource - true or false</li> <li>model - device model (empty if device is identifying or not detected)</li> <li>serial - device serial (empty if device is identifying or not detected)</li> <li>caseId - case identifier</li> <li>evidenceId - evidence identifier from case</li> </ul>",
                "parameters": [
                    {
                        "name": "<portId>",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Port identifier, consists of port type and number. Case insensitive. This value is not a named query parameter; use <code>/api/scan-port?SATA1</code>, not <code>/api/scan-port?portId=SATA1</code>.</p> <p>Example:</p> <ul> <li><code>sata3</code></li> <li><code>IDE1</code></li> </ul> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4. </p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings. If used, it must be placed after the raw port identifier, for example <code>/api/scan-port?SATA1&token=...</code>.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "example": {
                                    "state": "task-progress",
                                    "isSource": true,
                                    "model": "SanDisk SDSSDA120G",
                                    "serial": "171431421695",
                                    "caseId": "CaseABC123",
                                    "evidenceId": "dev777"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/start-image": {
            "get": {
                "summary": "Start imaging",
                "description": "<p>Launches imaging from a source drive plugged into the specified Source port into a the specified network target folder. By default, target image is a compressed E01 but the file format can be changed in the parameters.</p> <p>Two mandatory parameters: <code>source</code> and <code>targetFolder</code>. Other parameters have default values, which can be adjusted.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/start-image?source=SATA4&targetFolder=//Server/Share</code></li> <li><code>http://TASKFORCE_IP/api/start-image?source=SATA4 SDSSDA120G Z32081RL&targetFolder=//10.0.0.14/Share</code></li> </ul>",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Source identifier. It can be specified in two ways: 1) Source port; 2) Source port, drive model and serial</p> <p>Examples:</p> <ul> <li>Source port: <code>SATA4</code></li> <li>Source port, drive model and serial: <code>SATA4 SanDisk SDSSDA120G 171108456213</code></li> </ul> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4. </p>"
                    },
                    {
                        "name": "targetFolder",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network folder path where target image is created. Supports Linux and Windows formats of path separators (slashes, backslashes).</p> <p>Examples:</p> <ul> <li><code>//10.0.0.14/Share</code></li> <li><code>//MyServer/Shared-folder</code></li> </ul>"
                    },
                    {
                        "name": "targetFile",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Target image file name without extension. If you don`t specify this parameter, target file name will be genereted from source disk model and serial.</p>"
                    },
                    {
                        "name": "settings",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Name of the customized imaging settings. Customized settings can be created and renamed on the imaging start page (after you select the source and the target(s) in UI).</p> <p>Default value: <code>Default</code></p>"
                    },
                    {
                        "name": "targetType",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Type of target image file. It can be <b>e01</b>, <b>aff4</b>, <b>raw</b>, <b>dd</b>, or <b>img</b>.</p> <p>Default value: <code>e01</code>. Unsupported values are treated as the default.</p>"
                    },
                    {
                        "name": "saveReport",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Save report in the target folder alongside with created image file.</p> <p>Accepted values: <code>yes</code>, <code>y</code>, <code>no</code>, <code>n</code>. Values <code>true</code> and <code>false</code> are not accepted.</p> <p>Default value: <code>yes</code></p>"
                    },
                    {
                        "name": "targetFolderLogin",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Username or login. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "targetFolderPwd",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Password. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "targetFolderDomain",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network domain. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "mountOptions",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Mount option for experienced users. Used when <code>targetFolder</code> points to a network path which requires custom mount options.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "dnsLookup",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>TaskForce 2 only option.</p><p>Specifies the method for resolving the remote server hostname.</p> <p>Acceptable values:</p> <ul> <li><code>taskforce</code> - Uses the firmware's hostname resolution logic (default behavior)</li> <li><code>cifs</code> - Uses the mount.cifs hostname resolution logic</li> </ul>"
                    },
                    {
                        "name": "e01Case",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Case ID written to E01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "e01Evid",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Evidence number written to E01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "e01Desc",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Description written to E01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "e01Inv",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Examiner/investigator name written to E01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "e01Comp",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Indicates whether E01 target image is compressed.</p> <p>Accepted values: <code>yes</code>, <code>y</code>, <code>no</code>, <code>n</code>. Values <code>true</code> and <code>false</code> are not accepted.</p> <p>Default value: <code>yes</code></p>"
                    },
                    {
                        "name": "e01Segment",
                        "in": "query",
                        "schema": {
                            "type": "number"
                        },
                        "description": "<p>Specify segment size for E01 file in GB. Minimal segment size is 1GB.</p> <p>Default value: 0 (It means TaskForce will create one E01 file)</p>"
                    },
                    {
                        "name": "aff4Case",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Case ID written to Aff4 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "aff4Evid",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Evidence number written to Aff4 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "aff4Inv",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Examiner/investigator name written to Aff4 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "aff4Comp",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Specify Aff4 image file compression type.</p> Available options: lz4, snappy, not compressed</p> <p>Default value: <code>not compressed</code></p>"
                    },
                    {
                        "name": "aff4Hash",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Specify Aff4 image file hash type.</p> Available options: md5, sha1, md5+sha1, sha256, sha512</p> <p>Default value: <code>md5+sha1</code></p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Returns <b>taskKey</b> if imaging starts successfully. <p>Use this taskKey to track imaging via /api/check-task. Example: <br> <code>/api/check-task?taskKey=image_0_SanDisk%20SDSSDA120G_171108456213_Z32081RL_57eafc6f-e405-485a-be55-b0ab765e4223</code></p> <p>Expected /api/check-task response fields for this task:</p> <p><code>completionDate</code>, <code>message</code>, <code>report</code>, <code>hashes</code>, <code>errors</code>, <code>state</code>, <code>source</code>, <code>port</code>, <code>task</code>, <code>taskStep</code>, <code>progress</code>, <code>target</code>.</p> <pre>{ \"completionDate\": \"2021-12-30 13:30\", \"message\": \"completed\", \"report\": \"//Server/share/SanDisk SDSSDA120G171108456213_0_E01_report/Report.html\", \"hashes\": { \"MD5\": \"8ab092155e30c77e02a5708bdb1385e2\", \"SHA1\": \"47c173429553add911e2686125f9cd702f24ff37\" }, \"errors\": 0, \"state\": \"completed\", \"source\": \"SanDisk SDSSDA120G 171108456213\", \"port\": \"SATA 4\", \"task\": \"image\", \"taskStep\": \"post-hash\", \"progress\": 100, \"target\": \"//Server/share/SanDisk SDSSDA120G171108456213_0.E01\" }</pre>",
                        "content": {
                            "text/plain": {
                                "type": "string",
                                "example": "image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223"
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "403": {
                        "description": "Forbidden. Incorrect network path or its credentials. Check whether you specified an existing network path, valid login and password to access a remote shared folder."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Check network connection with TaskForce."
                    }
                }
            }
        },
        "/start-logical": {
            "get": {
                "summary": "Start logical imaging",
                "description": "<p>Launches logical imaging from a source drive plugged into the specified Source port into a the specified network target folder. By default, target image is a compressed L01 but the file format can be changed in the parameters.</p> <p>Two mandatory parameters: <code>source</code> and <code>targetFolder</code>. Other parameters have default values, which can be adjusted.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/start-logical?source=SATA4&targetFolder=//Server/Share</code></li> <li><code>http://TASKFORCE_IP/api/start-logical?source=SATA4 SDSSDA120G Z32081RL&targetFolder=//10.0.0.14/Share</code></li> </ul>",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Source identifier. It can be specified in two ways: 1) Source port; 2) Source port, drive model and serial</p> <p>Examples:</p> <ul> <li>Source port: <code>SATA4</code></li> <li>Source port, drive model and serial: <code>SATA4 SanDisk SDSSDA120G 171108456213</code></li> </ul> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4.</p>"
                    },
                    {
                        "name": "targetFolder",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network folder path where target image is created. Supports Linux and Windows formats of path separators (slashes, backslashes).</p> <p>Examples:</p> <ul> <li><code>//10.0.0.14/Share</code></li> <li><code>//MyServer/Shared-folder</code></li> </ul>"
                    },
                    {
                        "name": "targetFile",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Target image file name without extension. If you don`t specify this parameter, target file name will be genereted from source disk model and serial.</p>"
                    },
                    {
                        "name": "settings",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Name of the logical imaging settings with filters. Customized settings can be created and save on the logical imaging start page. Use 3-dot button in the bottom right corner and \"Save to\" option.</p> <p>Default value: <code>Default</code></p>"
                    },
                    {
                        "name": "targetType",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Type of target image file. In can be either <b>L01</b> or <b>zip</b>.</p> <p>Default value: <code>L01</code></p>"
                    },
                    {
                        "name": "saveReport",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Save report in the target folder alongside with created image file.</p> <p>Accepted values: <code>yes</code>, <code>y</code>, <code>no</code>, <code>n</code>. Values <code>true</code> and <code>false</code> are not accepted.</p> <p>Default value: <code>yes</code></p>"
                    },
                    {
                        "name": "targetFolderLogin",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Username or login. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "targetFolderPwd",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Password. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "targetFolderDomain",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network domain. Used when <code>targetFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "mountOptions",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Mount option for experienced users. Used when <code>targetFolder</code> points to a network path which requires custom mount options.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "dnsLookup",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>TaskForce 2 only option.</p><p>Specifies the method for resolving the remote server hostname.</p> <p>Acceptable values:</p> <ul> <li><code>taskforce</code> - Uses the firmware's hostname resolution logic (default behavior)</li> <li><code>cifs</code> - Uses the mount.cifs hostname resolution logic</li> </ul>"
                    },
                    {
                        "name": "l01Case",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Case ID written to L01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "l01Evid",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Evidence number written to L01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "l01Desc",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Description written to L01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "l01Inv",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Examiner/investigator name written to L01 image file metadata.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "compression",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Indicates whether target image is compressed.</p> <p>Accepted values: <code>yes</code>, <code>y</code>, <code>no</code>, <code>n</code>.</p> <p>Default value: <code>yes</code></p>"
                    },
                    {
                        "name": "hash",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Specifies whether each file inside L01 image should include its hash. Available options: md5, sha1, md5+sha1, none</p> <p>Default value: <code>md5+sha1</code></p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Returns <b>taskKey</b> if logical imaging starts successfully. <p>Use this taskKey to track logical imaging via /api/check-task. Example: <br> <code>/api/check-task?taskKey=logical_0_SanDisk%20SDSSDA120G_171108456213_Z32081RL_57eafc6f-e405-485a-be55-b0ab765e4223</code></p> <p>Expected /api/check-task response fields for this task:</p> <p><code>completionDate</code>, <code>message</code>, <code>report</code>, <code>errors</code>, <code>state</code>, <code>source</code>, <code>port</code>, <code>task</code>, <code>progress</code>, <code>target</code>.</p> <pre>{ \"completionDate\": \"2021-12-30 13:30\", \"message\": \"completed\", \"report\": \"//Server/share/LogicalImage_report/Report.html\", \"errors\": 1, \"state\": \"completed\", \"source\": \"SanDisk SDSSDA120G 171108456213\", \"port\": \"SATA 4\", \"task\": \"logical\", \"progress\": 100, \"target\": \"//Server/share/LogicalImage.l01\" }</pre>",
                        "content": {
                            "text/plain": {
                                "type": "string",
                                "example": "logical_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223"
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "403": {
                        "description": "Forbidden. Incorrect network path or its credentials. Check whether you specified an existing network path, valid login and password to access a remote shared folder."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Check network connection with TaskForce."
                    }
                }
            }
        },
        "/diagnose": {
            "get": {
                "summary": "Diagnose drive",
                "description": "<p>Launches diagnostics of a drive. The diagnostics can be performed for drives in both modes: Source and Target.</p> <p>One mandatory parameter: <code>source</code>. Other parameters have default values, that can be adjusted.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/diagnose?source=SATA4</code></li> <li><code>http://TASKFORCE_IP/api/diagnose?source=SATA4 SDSSDA120G Z32081RL</code></li> </ul>",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Identifier of the drive in Source or Target mode. It can be specified in two ways: 1) Drive port; 2) Drive port, drive model and serial</p> <p>Examples:</p> <ul> <li>Drive port: <code>SATA4</code></li> <li>Drive port, drive model and serial: <code>SATA4 SanDisk SDSSDA120G 171108456213</code></li> </ul> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4."
                    },
                    {
                        "name": "reportFolder",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network folder path where diagnostic report copy will be saved. Supports Linux and Windows formats of path separators (slashes, backslashes).</p> <p>Empty by default.</p> <p>Examples:</p> <ul> <li><code>//10.0.0.14/Share</code></li> <li><code>//MyServer/Shared-folder</code></li> </ul>"
                    },
                    {
                        "name": "reportFolderLogin",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Username or login. Used when <code>reportFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "reportFolderPwd",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Password. Used when <code>reportFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "reportFolderDomain",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network domain. Used when <code>reportFolder</code> points to a password-protected network path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "mountOptions",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Mount option for experienced users. Used when <code>reportFolder</code> points to a network path which requires custom mount options.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "dnsLookup",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>TaskForce 2 only option.</p><p>Specifies the method for resolving the remote server hostname.</p> <p>Acceptable values:</p> <ul> <li><code>taskforce</code> - Uses the firmware's hostname resolution logic (default behavior)</li> <li><code>cifs</code> - Uses the mount.cifs hostname resolution logic</li> </ul>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the api/login endpoint. The token becomes a mandatory parameter when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Returns <b>taskKey</b> if diagnostics start successfully. <p>Use this taskKey to track diagnostics via /api/check-task. Example: <br> <code>/api/check-task?taskKey=diagnose_0_SanDisk%20SDSSDA120G_171108456213_Z32081RL_57eafc6f-e405-485a-be55-b0ab765e4223</code></p> <p>Expected /api/check-task response fields for this task:</p> <p><code>completionDate</code>, <code>message</code>, <code>report</code>, <code>state</code>, <code>source</code>, <code>port</code>, <code>task</code>, <code>progress</code>.</p> <pre>{ \"completionDate\": \"2021-12-30 13:30\", \"message\": \"Diagnostics completed (API)\", \"report\": \"//Server/share/Diagnostics_report.html\", \"state\": \"completed-warning\", \"source\": \"SanDisk SDSSDA120G 171108456213\", \"port\": \"SATA 4\", \"task\": \"Diagnostics\", \"progress\": 100 }</pre>",
                        "content": {
                            "text/plain": {
                                "example": "diagnose_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223"
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "403": {
                        "description": "Forbidden. Incorrect network path or its credentials. Check whether you specified an existing network path, valid login and password to access a remote shared folder."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Check network connection with TaskForce."
                    }
                }
            }
        },
        "/compare": {
            "get": {
                "summary": "Compare drives or image files",
                "description": "<p>Performs a sector-by-sector comparison between a drive, an image file, or a pattern. Supports multiple comparison modes and optional LBA range filtering:</p> <ul> <li>Compare with <code>HEX pattern</code></li> <li>Compare with <code>LBA number signature in each sector</code></li> <li>1-to-1 comparison between two disks or between a disk and a file</li> </ul> <p>Two mandatory parameters: <code>source</code> and <code>target</code>. Other parameters have default values, that can be adjusted.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/compare?source=SATA2&target=SATA3</code></li> <li><code>http://TASKFORCE_IP/api/compare?source=SATA2&target=//10.0.0.11/shared/image.aff4</code></li> <li><code>http://TASKFORCE_IP/api/compare?source=SATA2&target=lbaPattern</code></li> <li><code>http://TASKFORCE_IP/api/compare?source=SATA4 SDSSDA120G Z32081RL&target=00</code></li> </ul>",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Source identifier. It can be specified in two ways: 1) Source port; 2) Source port, drive model and serial</p> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4.</p>"
                    },
                    {
                        "name": "target",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Target identifier. It can be specified in several ways:</p> <ul> <li>1) Target port</li> <li>2) Target port, drive model and serial</li> <li>3) File path</li> <li>4) HEX pattern (e.g., <code>00FFAA</code>)</li> <li>5) <code>lbaPattern</code> string</li> </ul>"
                    },
                    {
                        "name": "startLba",
                        "in": "query",
                        "schema": {
                            "type": "number"
                        },
                        "description": "<p>Start LBA for comparison. If not specified, the default value is 0.</p>"
                    },
                    {
                        "name": "endLba",
                        "in": "query",
                        "schema": {
                            "type": "number"
                        },
                        "description": "<p>End LBA for comparison. If not specified, the default value is the last LBA of the disk or image.</p>"
                    },
                    {
                        "name": "reportFolder",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network folder path where compare report copy will be saved. Supports Linux and Windows formats of path separators (slashes, backslashes).</p> <p>Empty by default.</p> <p>Examples:</p> <ul> <li><code>//10.0.0.14/Share</code></li> <li><code>//MyServer/Shared-folder</code></li> </ul>"
                    },
                    {
                        "name": "folderLogin",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Username or login. Used when <code>reportFolder</code> points to a password-protected network path, or when <code>target</code> is a password-protected network file path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "folderPwd",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Password. Used when <code>reportFolder</code> points to a password-protected network path, or when <code>target</code> is a password-protected network file path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "folderDomain",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Network domain. Used when <code>reportFolder</code> points to a password-protected network path, or when <code>target</code> is a password-protected network file path.</p> <p>Empty by default.</p>"
                    },
                    {
                        "name": "mountOptions",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p> Mount options for experienced users. These options are shared and applied to both <code>reportFolder</code> (when it points to a network path) and <code>target</code> (if it is a network file path). Use them when custom mount parameters, credentials, or DNS resolution are required. </p>"
                    },
                    {
                        "name": "dnsLookup",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>TaskForce 2 only option.</p><p>Specifies the method for resolving the remote server hostname. This setting is applied to both <code>reportFolder</code> (when it points to a network path) and <code>target</code> (if it is a network file path).</p> <p>Acceptable values:</p> <ul> <li><code>taskforce</code> - Uses the firmware's hostname resolution logic (default behavior)</li> <li><code>cifs</code> - Uses the mount.cifs hostname resolution logic</li> </ul>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Returns <b>taskKey</b> if comparison starts successfully. <p>Use this taskKey to track comparison via /api/check-task. Example: <br> <code>/api/check-task?taskKey=compare_0_SanDisk%20SDSSDA120G_171108456213_Z32081RL_57eafc6f-e405-485a-be55-b0ab765e4223</code></p> <p>Expected /api/check-task response fields for this task:</p> <p><code>completionDate</code>, <code>message</code>, <code>report</code>, <code>errors</code>, <code>processedSectors</code>, <code>differentSectors</code>, <code>state</code>, <code>source</code>, <code>port</code>, <code>task</code>, <code>progress</code>.</p> <pre>{ \"completionDate\": \"2021-12-30 13:30\", \"message\": \"Comparison completed (API)\", \"report\": \"//Server/share/Compare_report.html\", \"errors\": 0, \"processedSectors\": 1000, \"differentSectors\": 128, \"state\": \"completed\", \"source\": \"SanDisk SDSSDA120G 171108456213\", \"port\": \"SATA 4\", \"task\": \"Compare\", \"progress\": 100 }</pre>",
                        "content": {
                            "text/plain": {
                                "example": "compare_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223"
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "403": {
                        "description": "Forbidden. Incorrect network path or its credentials. Check whether you specified an existing network path, valid login and password to access a remote shared folder."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Check network connection with TaskForce."
                    }
                }
            }
        },
        "/check-task": {
            "get": {
                "summary": "Check task status",
                "description": "<p>Gets data about the progress of running or completed tasks. Requires <code>taskKey</code> or <code>source</code> parameter:<br/> <ul> <li><code>taskKey</code> value is generated in response to /start-image, /start-logical, /diagnose or /compare request.</li> <li><code>source</code> value can be specified in two ways: 1) Source port; 2) Source port, drive model and serial.</li> </ul> </p> <p>Example:</p> <ul> <li><code>http://TASKFORCE_IP/api/check-task?taskKey=image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223</code></li> <li><code>http://TASKFORCE_IP/api/check-task?source=SATA5</code></li> </ul> <p> Returns a JSON object with fields that are applicable to the checked operation. Fields that do not belong to an operation are omitted. <ul> <li>state - completed, failed, progress, paused, completed-warning, stopped or initial</li> <li>task - name of the task. Example: image</li> <li>taskStep - a stage of the task. For imaging it can be: pre-hash, image, post-hash. For diagnostics possible stages are: Circuit board, File system, Firmware, Heads and Media scan.</li> <li>source - source device model and serial</li> <li>port - unit port where a device was plugged in. Example: SATA 3</li> <li>progress - shown in percents. If state=failed, then progress=-1</li> <li>errors - number of task-specific errors. For Imaging it is unreadable sectors; for Logical it is files with errors; for Compare it is unreadable sectors. Diagnostics responses do not include this field.</li> <li>message - additional information</li> <li>completionDate - completion date and time of the task</li> <li>target - file path to the network target image </li> <li>report - file path to the network task report </li> <li>hashes - one or two image hashes calculated during imaging </li> <li>processedSectors - number of processed sectors for Compare</li> <li>differentSectors - number of different sectors detected by Compare</li> </ul> </p>",
                "parameters": [
                    {
                        "name": "taskKey",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Task identifier. It is generated in response to /start-image, /start-logical, /diagnose or /compare request. Either this parameter or source must be specified.</p> <p>Example:</p> <ul> <li><code>image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223 </code></li> </ul>"
                    },
                    {
                        "name": "source",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Source identifier. It can be specified in two ways: 1) Source port; 2) Source port, drive model and serial. Either this parameter or taskKey must be specified.</p> <p>Examples:</p> <ul> <li>Source port: <code>SATA4</code></li> <li>Source port, drive model and serial: <code>SATA4 SanDisk SDSSDA120G 171108456213</code></li> </ul> <p>Acceptable port names are SATA1, SATA2, SATA3, SATA4, SATA5, SATA6, SAS1, SAS2, SAS3, SAS4, SAS5, SAS6, USB1, USB2, USB3, USB4, IDE1, EXT1<br> and, for TaskForce 2 only: SATA7, SATA8, SAS7, SAS8, NVME1, NVME2, NVME3, NVME4.</p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "examples": {
                                    "imagingCheckResponse": {
                                        "summary": "Imaging Check response",
                                        "value": {
                                            "completionDate": "2021-12-30 13:30",
                                            "message": "completed",
                                            "report": "//Server/share/SanDisk SDSSDA120G171108456213_0_E01_report/Report.html",
                                            "hashes": {
                                                "MD5": "8ab092155e30c77e02a5708bdb1385e2",
                                                "SHA1": "47c173429553add911e2686125f9cd702f24ff37"
                                            },
                                            "errors": 0,
                                            "state": "completed",
                                            "source": "SanDisk SDSSDA120G 171108456213",
                                            "port": "SATA 4",
                                            "task": "image",
                                            "taskStep": "post-hash",
                                            "progress": 100,
                                            "target": "//Server/share/SanDisk SDSSDA120G171108456213_0.E01"
                                        }
                                    },
                                    "logicalCheckResponse": {
                                        "summary": "Logical Check response",
                                        "value": {
                                            "completionDate": "2021-12-30 13:30",
                                            "message": "completed",
                                            "report": "//Server/share/LogicalImage_report/Report.html",
                                            "errors": 1,
                                            "state": "completed",
                                            "source": "SanDisk SDSSDA120G 171108456213",
                                            "port": "SATA 4",
                                            "task": "logical",
                                            "progress": 100,
                                            "target": "//Server/share/LogicalImage.l01"
                                        }
                                    },
                                    "diagnosticCheckResponse": {
                                        "summary": "Diagnostic Check response",
                                        "value": {
                                            "completionDate": "2021-12-30 13:30",
                                            "message": "Diagnostics completed (API)",
                                            "report": "//Server/share/Diagnostics_report.html",
                                            "state": "completed-warning",
                                            "source": "SanDisk SDSSDA120G 171108456213",
                                            "port": "SATA 4",
                                            "task": "Diagnostics",
                                            "progress": 100
                                        }
                                    },
                                    "compareCheckResponse": {
                                        "summary": "Compare Check response",
                                        "value": {
                                            "completionDate": "2021-12-30 13:30",
                                            "message": "Comparison completed (API)",
                                            "report": "//Server/share/Compare_report.html",
                                            "errors": 0,
                                            "processedSectors": 1000,
                                            "differentSectors": 128,
                                            "state": "completed",
                                            "source": "SanDisk SDSSDA120G 171108456213",
                                            "port": "SATA 4",
                                            "task": "Compare",
                                            "progress": 100
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Check network connection with TaskForce."
                    }
                }
            }
        },
        "/stop-task": {
            "get": {
                "summary": "Stop running task",
                "description": "<p>Running this request pauses active task or stop it (for tasks that can not be paused). Corresponding task report will be created. Paused task can be restarted in TaskForce user interface.</p> <p> Either <code>taskKey</code> or <code>source</code> is mandatory. Use only one of them.</p> <p>Example:</p> <ul> <li><code>http://TASKFORCE_IP/api/stop-task?taskKey=image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223 </code></li> <li><code>http://TASKFORCE_IP/api/stop-task?source=SATA1%20ST500LM012%20HN-M500MBB</code></li> </ul> ",
                "parameters": [
                    {
                        "name": "taskKey",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Task identifier. It is generated in response to /start-image, /start-logical, /diagnose or /compare request. Either this parameter or source must be specified.</P <p>Example:</p> <ul> <li><code>image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223 </code></li> </ul>"
                    },
                    {
                        "name": "source",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Source identifier. Specify source port, drive model and serial. Either this parameter or taskKey must be specified.</p> <p>Example:</p> <ul> <li>Source port, drive model and serial: <code>SATA1 ST500LM012 HN-M500MBB</code></li> </ul>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/create-case": {
            "get": {
                "summary": "Create case",
                "description": "<p>Creates a new case for a drive and associates it with the provided case details. Use this endpoint to start tracking a new forensic case for a specific drive.</p> <p>The drive must be identified and powered on at one of the available ports before calling this endpoint. The drive cannot be busy with another running task.</p> <p>Specifying <code>source</code> or pair of <code>model</code> + <code>serial</code> is mandatory to identify the drive.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/create-case?source=SATA4%20SanDisk%20SDSSDA120G%20171108456213&caseId=CASE-001&caseDescription=Evidence%20from%20suspect%20laptop</code></li> <li><code>http://TASKFORCE_IP/api/create-case?model=SDSSDA120G&serial=171108456213&caseId=CASE-001&evidenceId=EV-001</code></li> </ul> ",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Drive identifier in a format retrievable from <code>/scan-devices</code> request. Drive must be identified and powered on respective port.</p> <p>Examples:</p> <ul> <li>Source port, drive model and serial: <code>SATA4 SanDisk SDSSDA120G 171108456213</code></li> </ul> </p>"
                    },
                    {
                        "name": "model",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Model of the drive. It can be retrieved using the <code>/scan-port</code> request endpoint.</p> <ul> <li>Must be provided alongside the <code>serial</code> parameter.</li> </ul>"
                    },
                    {
                        "name": "serial",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Serial number of the drive. It can be retrieved using the <code>/scan-port</code> request endpoint.</p> <ul> <li>Must be provided alongside the <code>model</code> parameter.</li> </ul>"
                    },
                    {
                        "name": "caseId",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Case ID field will be assigned to this value. It must be unique within the system if TaskForce setting  ‘Allow non-unique case names’ is disabled.</p>"
                    },
                    {
                        "name": "caseExaminer",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Case examiner field will be assigned to this value.</p>"
                    },
                    {
                        "name": "caseDescription",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Case description field will be assigned to this value.</p>"
                    },
                    {
                        "name": "caseLocation",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Case location field will be assigned to this value.</p>"
                    },
                    {
                        "name": "caseOrganization",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Case organization field will be assigned to this value.</p>"
                    },
                    {
                        "name": "evidenceId",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The identifier used to link the drive to a case. If provided, Evidence ID field will be assigned to this value.</p>"
                    },
                    {
                        "name": "evidenceExaminer",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>If provided, Evidence examiner field will be assigned to this value  .</p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Case created successfully."
                    },
                    "400": {
                        "description": "Bad request. Drive not found, drive is busy, or invalid parameters. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/edit-case": {
            "get": {
                "summary": "Edit case",
                "description": "<p>Updates the details of an existing case. Use this endpoint to modify case information such as description, examiner, location, or organization for a previously created case.</p> <p>The case must be associated with the specified caseId. If no matching case is found, the request will fail with an error.</p> <p>Examples:</p> <ul> <li><code>http://TASKFORCE_IP/api/edit-case?caseId=CASE-001&caseDescription=Updated%20description&caseExaminer=John%20Smith</code></li> </ul> ",
                "parameters": [
                    {
                        "name": "caseId",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The identifier used to locate the case to update.</p> <ul> <li>If one or more matching cases are found, the most recently used case will be selected for details update.</li> <li>If no matching case is found, the request will fail with an error.</li> </ul>"
                    },
                    {
                        "name": "caseExaminer",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The new name or ID to be assigned as the case examiner. If provided, this value will overwrite the existing examiner field for the case.</p>"
                    },
                    {
                        "name": "caseDescription",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The new text value to assign as the case description. If provided, this value will overwrite the existing description field for the case.</p>"
                    },
                    {
                        "name": "caseLocation",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The new text value to assign as the case location. If provided, this value will overwrite the existing location field for the case.</p>"
                    },
                    {
                        "name": "caseOrganization",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The new text value to assign as the case organization. If provided, this value will overwrite the existing organization field for the case.</p>"
                    },
                    {
                        "name": "evidenceId",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The identifier used to locate evidence in the case to update the evidence examiner name. The new evidence examiner name must be specified by <code>evidenceExaminer</code>.</p> <p>The new evidence examiner value will be assigned to all evidence drives that match this identifier.</p"
                    },
                    {
                        "name": "evidenceExaminer",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>The new name for the evidence examiner which is defined by the specified <code>evidenceId</code. If provided, this value will overwrite the existing examiner field for the evidence.</p>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK. Case updated successfully."
                    },
                    "400": {
                        "description": "Bad request. Case not found or invalid parameters. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/report": {
            "get": {
                "summary": "Download report",
                "description": "<p>Downloads a report for a task.</p> <p>HTTP response is as follows: <p>For /start-image, /start-logical and /compare tasks, a text/plain with a ZIP file containing all report files and logs is attached in the Content Disposition header.</p> <p>For /diagnose task, a text/plain with an HTML report file is attached in the Content Disposition header.</p> <p>The <code>taskKey</code> is a mandatory parameter. Its value is generated in response to a /start-image, /start-logical, /diagnose, or /compare request.</p> <p>Example:</p> <ul> <li><code>http://TASKFORCE_IP/api/report?taskKey=image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223 </code></li> </ul>",
                "parameters": [
                    {
                        "name": "taskKey",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>Task identifier. It is generated in response to /start-image, /start-logical, /diagnose or /compare request.</P <p>Example:</p> <ul> <li><code>image_0_SanDisk%20SDSSDA120G_171108456213_Z32080R_57eafc6f-e405-485a-be55-b0ab765e4223 </code></li> </ul>"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "<p>User access token provided by the /login endpoint. Required when User Management is enabled in UI settings.</p> <p>Example: 9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478</p>"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "text/plain": {
                                "examples": {
                                    "diagnosticTaskResponse": {
                                        "value": "Content-Disposition: \"attachment; filename=taskKey.html\""
                                    },
                                    "imagingTaskResponse": {
                                        "value": "Content-Disposition: \"attachment; filename=taskKey.zip\""
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User access token is not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/login": {
            "post": {
                "summary": "Login as user",
                "description": "<p>Validates user credentials from HTTP request body. If valid and associated with an existing user, it will issue an access token.</p> <p>Note: User management must be activated in UI settings.</p> <p>Example:</p> <ul> <li><code>http://TASKFORCE_IP/api/login</code></li> </ul>",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "username",
                                    "password"
                                ],
                                "properties": {
                                    "username": {
                                        "description": "Name of existing TaskForce user.",
                                        "type": "string",
                                        "example": "admin"
                                    },
                                    "password": {
                                        "description": "Password of the user.",
                                        "type": "string",
                                        "example": 12345
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "text/plain": {
                                "examples": {
                                    "userAccessToken": {
                                        "value": "9b6af926253943f38f29c73b3dcdfd9ac761350b0713b07aed49c9348a4bf478"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request. Any unexpected error. Error message returned as HTTP message body."
                    },
                    "401": {
                        "description": "Unauthorized. User credentials are not valid."
                    },
                    "408": {
                        "description": "Timeout. The request took too long. Make sure TaskForce and/or the device from which it is operated are connected to the network."
                    }
                }
            }
        },
        "/help": {
            "get": {
                "summary": "Show API documentation",
                "description": "Opens this API documentation page.",
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": []
}
