---
title: "Merge two projects"
description: "Moves child resources from the source project to the target project and deletes the source project"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.testandaccept.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: Test And Accept API › Projects

`POST /projects/merge`

Moves child resources from the source project to the target project and deletes the source project

## Authentication

- `bearerAuth`, http, header `Authorization`, format `tnda_ token`

## Request body

_Required._

- `targetProjectId` (`projects-merge.targetProjectId`; string, required)
  - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$`
- `sourceProjectId` (`projects-merge.sourceProjectId`; string, required)
  - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$`

## Example request

```json
{
  "targetProjectId": "12c621fc-9c1e-4a5b-8872-128a71b0fe83",
  "sourceProjectId": "eaca5730-d700-4e04-b6cb-0d0b8b90adac"
}
```

## Code samples

### cURL

```bash
curl --request POST \
  --url https://api.testandaccept.com/api/rest/projects/merge \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "targetProjectId": "12c621fc-9c1e-4a5b-8872-128a71b0fe83",
  "sourceProjectId": "eaca5730-d700-4e04-b6cb-0d0b8b90adac"
}
'
```

### TypeScript

```typescript
const url = 'https://api.testandaccept.com/api/rest/projects/merge';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json', Authorization: 'Bearer <token>'},
  body: JSON.stringify({
    targetProjectId: '12c621fc-9c1e-4a5b-8872-128a71b0fe83',
    sourceProjectId: 'eaca5730-d700-4e04-b6cb-0d0b8b90adac'
  })
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.testandaccept.com/api/rest/projects/merge"

payload = {
    "targetProjectId": "12c621fc-9c1e-4a5b-8872-128a71b0fe83",
    "sourceProjectId": "eaca5730-d700-4e04-b6cb-0d0b8b90adac"
}
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer <token>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
```

## Responses

### 200

Successful response

#### Example

```json
{
  "mergedProject": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "string",
    "description": "string",
    "status": "string",
    "clientId": "5e505642-9024-474d-9434-e5a44f505cc5",
    "clientName": "string",
    "contactId": "b5ec5d98-4bee-4da1-ad24-dde86346cb1d",
    "startDate": "2019-08-24T14:15:22Z",
    "endDate": "2019-08-24T14:15:22Z",
    "ownerUserId": "string",
    "organizationId": "string",
    "isPinned": true,
    "pinnedAt": "2019-08-24T14:15:22Z",
    "sowCount": 0,
    "createdAt": "2019-08-24T14:15:22Z",
    "updatedAt": "2019-08-24T14:15:22Z"
  },
  "sourceProject": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "string"
  },
  "summary": {
    "statementsOfWork": 0,
    "rfcs": 0,
    "rootCauseAnalyses": 0,
    "userStories": 0,
    "projectFollowers": 0,
    "integrationChannels": 0,
    "resourceAccess": 0,
    "resourceInvitations": 0
  },
  "deletedProjectId": "01e80e19-3e02-48c0-b0b7-f466b94ade59"
}
```

- `mergedProject` (`projects-merge.response.200.mergedProject`; object, required)
  - `id` (`projects-merge.response.200.mergedProject.id`; string, required)
    - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$`
  - `name` (`projects-merge.response.200.mergedProject.name`; string, required)
  - `status` (`projects-merge.response.200.mergedProject.status`; string, required)
  - `clientId` (`projects-merge.response.200.mergedProject.clientId`; any of, required)
    - any of: `string`, `null`
  - `contactId` (`projects-merge.response.200.mergedProject.contactId`; any of, required)
    - any of: `string`, `null`
  - `startDate` (`projects-merge.response.200.mergedProject.startDate`; any of, required)
    - any of: `string`, `null`
  - `endDate` (`projects-merge.response.200.mergedProject.endDate`; any of, required)
    - any of: `string`, `null`
  - `ownerUserId` (`projects-merge.response.200.mergedProject.ownerUserId`; string, required)
  - `organizationId` (`projects-merge.response.200.mergedProject.organizationId`; any of, required)
    - any of: `string`, `null`
  - `isPinned` (`projects-merge.response.200.mergedProject.isPinned`; boolean, required)
  - `pinnedAt` (`projects-merge.response.200.mergedProject.pinnedAt`; any of, required)
    - any of: `string`, `null`
  - `sowCount` (`projects-merge.response.200.mergedProject.sowCount`; number, required)
  - `createdAt` (`projects-merge.response.200.mergedProject.createdAt`; string, required)
    - format `date-time`; pattern `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$`
  - `updatedAt` (`projects-merge.response.200.mergedProject.updatedAt`; string, required)
    - format `date-time`; pattern `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$`
  - `description` (`projects-merge.response.200.mergedProject.description`; any of, optional)
    - any of: `string`, `null`
  - `clientName` (`projects-merge.response.200.mergedProject.clientName`; any of, optional)
    - any of: `string`, `null`
- `sourceProject` (`projects-merge.response.200.sourceProject`; object, required)
  - `id` (`projects-merge.response.200.sourceProject.id`; string, required)
    - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$`
  - `name` (`projects-merge.response.200.sourceProject.name`; string, required)
- `summary` (`projects-merge.response.200.summary`; object, required)
  - `statementsOfWork` (`projects-merge.response.200.summary.statementsOfWork`; number, required)
  - `rfcs` (`projects-merge.response.200.summary.rfcs`; number, required)
  - `rootCauseAnalyses` (`projects-merge.response.200.summary.rootCauseAnalyses`; number, required)
  - `userStories` (`projects-merge.response.200.summary.userStories`; number, required)
  - `projectFollowers` (`projects-merge.response.200.summary.projectFollowers`; number, required)
  - `integrationChannels` (`projects-merge.response.200.summary.integrationChannels`; number, required)
  - `resourceAccess` (`projects-merge.response.200.summary.resourceAccess`; number, required)
  - `resourceInvitations` (`projects-merge.response.200.summary.resourceInvitations`; number, required)
- `deletedProjectId` (`projects-merge.response.200.deletedProjectId`; string, required)
  - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$`

### 400

Invalid input data

#### Example

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- `message` (`projects-merge.response.400.message`; string, required) — The error message
  - example `"Invalid input data"`
- `code` (`projects-merge.response.400.code`; string, required) — The error code
  - example `"BAD_REQUEST"`
- `issues` (`projects-merge.response.400.issues`; array<object>, optional) — An array of issues that were responsible for the error
  - example `[]`
  - `message` (`projects-merge.response.400.issues.message`; string, required)

### 401

Authorization not provided

#### Example

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- `message` (`projects-merge.response.401.message`; string, required) — The error message
  - example `"Authorization not provided"`
- `code` (`projects-merge.response.401.code`; string, required) — The error code
  - example `"UNAUTHORIZED"`
- `issues` (`projects-merge.response.401.issues`; array<object>, optional) — An array of issues that were responsible for the error
  - example `[]`
  - `message` (`projects-merge.response.401.issues.message`; string, required)

### 403

Insufficient access

#### Example

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- `message` (`projects-merge.response.403.message`; string, required) — The error message
  - example `"Insufficient access"`
- `code` (`projects-merge.response.403.code`; string, required) — The error code
  - example `"FORBIDDEN"`
- `issues` (`projects-merge.response.403.issues`; array<object>, optional) — An array of issues that were responsible for the error
  - example `[]`
  - `message` (`projects-merge.response.403.issues.message`; string, required)

### 500

Internal server error

#### Example

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

- `message` (`projects-merge.response.500.message`; string, required) — The error message
  - example `"Internal server error"`
- `code` (`projects-merge.response.500.code`; string, required) — The error code
  - example `"INTERNAL_SERVER_ERROR"`
- `issues` (`projects-merge.response.500.issues`; array<object>, optional) — An array of issues that were responsible for the error
  - example `[]`
  - `message` (`projects-merge.response.500.issues.message`; string, required)


Source: https://docs.testandaccept.com/reference/projects/merge/index.md
