Create Test Plan(Appium2)
The endpoint creates a new test plan for a specific project. The user must provide project details and plan specifications in the request body. The API validates the input and returns the created plan as a ProjectDTO object.
Note: After the plan is created, the Create Period, Create Plan Scenarios, and Create Plan Environment APIs must be executed to ensure the workflow runs correctly.
Endpoint Information
- URL: <your-gateway-url>/plan
- Method: POST
- Authentication: Required (Bearer Token)
Request Body Table
The JSON format request data that needs to be sent for creating a test plan is as follows:
{
"planName": "Sample Test Plan",
"groupPlan": false,
"description": "This is a sample test plan for demonstration purposes.",
"type": "APPIUM",
"enabled": true,
"deleted": false,
"planParallelTestLimit": 5,
"projectId": 709,
"userId": 1,
"companyId": 1,
"failedTestRetryCount": 2,
"maxExecutionTime": 3600,
"testRunType": "CROSS",
"screenShotType": "YES",
"videoEnabled": true,
"uninstallApp": false,
"clearAppData": false,
"androidMobileApp": null,
"iosMobileApp": 118,
"isSigned": true,
"alertsEnabled": false
}
Parameter | Type | Description |
|---|---|---|
planName | string | The name of the test plan displayed in the user interface. |
groupPlan | boolean | Indicates whether the plan is a group plan. |
description | string | A detailed explanation or note describing the test plan. |
enabled | boolean | Determines whether the plan is active and can be executed. |
deleted | boolean | Marks the plan as deleted without permanently removing it. |
planParallelTestLimit | integer | The maximum number of tests allowed to run in parallel. |
projectId | integer | The ID of the project to which this plan belongs. |
userId | integer | The ID of the user who created or last updated the plan. |
companyId | integer | The ID of the company associated with this plan. |
failedTestRetryCount | integer | Specifies how many times failed tests will be retried. |
maxExecutionTime | integer | Maximum allowed execution time for this plan in seconds. |
testRunType | string | Determines how tests will run . |
screenShotType | string | The screenshot capture behavior (e.g., YES, NO, ON_FAILURE). |
videoEnabled | boolean | Indicates whether video recording will be enabled during execution. |
uninstallApp | boolean | Whether the app should be uninstalled before execution starts. |
clearAppData | boolean | Whether the app’s data should be cleared before execution. |
androidMobileApp | integer | The ID of the Android application used in this plan. |
iosMobileApp | integer | The ID of the iOS application used in this plan. |
isSigned | boolean | Indicates whether the associated mobile application is signed. |
alertsEnabled | boolean | Enables or disables alert notifications for this plan. |
Response Body Table
Upon a successful request, the API returns the following JSON structure:
{
"data": {
"id": 766,
"planName": "Sample Test Plan",
"groupPlan": false,
"description": "This is a sample test plan for demonstration purposes.",
"enabled": true,
"deleted": false,
"planParallelTestLimit": 5,
"projectId": 709,
"projectName": "Appium2GaugeCalisan",
"projectTestFramework": "APPIUM2",
"userId": 1,
"companyId": 1,
"failedTestRetryCount": 2,
"maxExecutionTime": 3600,
"testRunType": "CROSS",
"screenShotType": "YES",
"videoEnabled": false,
"uninstallApp": false,
"clearAppData": false,
"selectedIosMobileApp": {
"id": 118,
"mobileAppName": "demo",
"mobileAppHash": "demo",
"mobileAppMetadata": "demo",
"operatingSystem": "IOS",
"createdAt": "2025-04-07T04:58:11.588+00:00",
"apkMetaData": {
"packageName": null,
"activityName": null,
"label": null,
"icon": null,
"versionName": null,
"versionCode": null,
"installLocation": null,
"minSdkAndroidVersion": null,
"minSdkVersion": null,
"targetSdkVersion": null,
"maxSdkVersion": null,
"glEsVersion": null
},
"iosMetaData": {
"bundleName": "demo",
"bundleDisplayName": "demo",
"bundleVersion": "3.2.15",
"bundleMinOsVersion": "12.0",
"bundleDevelopmentRegion": "tr",
"bundleExecutable": "demo",
"bundleIconFiles": "",
"bundleInfoDictVersion": "6.0",
"bundlePackageType": "APPL",
"bundleMainStoryBoardFile": "Main",
"bundleIdentifier": "demos",
"teamName": "demo"
}
},
"isSigned": true,
"testFileType": "APPIUM_GAUGE",
"testRunnerTool": "MAVEN",
"testDispatchMethodType": "ONE_BY_ONE",
"alertsEnabled": false
},
"result": {
"code": 0,
"message": "success"
}
}Parameter | Type | Description |
|---|---|---|
data | Object | The payload of the response. In this case null since no extra data is returned. |
result | Object | Contains details about the outcome of the operation. |
result.code | Integer | The result code (e.g., 0 indicates success). |
result.message | String | A message describing the outcome (e.g., "success"). |
Error Codes
Possible error codes and their explanations during the operation:
HTTP Code | Error Message | Description |
|---|---|---|
401 | UNAUTHORIZED | The request lacks valid authentication credentials. Check your Bearer token. |
400 | INVALID_REQUEST | The request was malformed or contained errors. |
500 | INTERNAL_SERVER_ERROR | An unexpected error occurred on the server side. |

Application Error Codes
Code | Error Message |
|---|---|
10000 |  with id  not found |
10009 | Mobile App with {id} not found! |
10010 | {field} must not be null |
10011 | Plan name {0} already exists! |
Example Request
curl --location '<your-gateway-url>/plan' \
--header 'accept: application/json, text/plain, */*' \
--header 'authorization: Bearer <your_access_token>' \
--header 'content-type: application/json' \
--header 'Cookie: JSESSIONID=0D9219B3E88D8FE8513FF21049407F10' \
--data '{
"planName": "Sample Test Plan",
"groupPlan": false,
"description": "This is a sample test plan for demonstration purposes.",
"type": "APPIUM",
"enabled": true,
"deleted": false,
"planParallelTestLimit": 5,
"projectId": 709,
"userId": 1,
"companyId": 1,
"failedTestRetryCount": 2,
"maxExecutionTime": 3600,
"testRunType": "CROSS",
"screenShotType": "YES",
"videoEnabled": true,
"uninstallApp": false,
"clearAppData": false,
"androidMobileApp": null,
"iosMobileApp": 118,
"isSigned": true,
"alertsEnabled": false
}
'