Create a complete copy of an existing project with configurable options for what to include.
Copy a Project
The copy project mutation allows you to duplicate an existing project within the same company or to a different company. This is useful for creating project templates, setting up similar projects, or moving projects between companies. The copy operation runs asynchronously to handle large projects efficiently.
Basic Example
mutation CopyProject {
  copyProject(
    input: {
      projectId: "proj_123abc"
      name: "New Project Copy"
      options: {
        todos: true
        todoLists: true
        people: true
      }
    }
  )
}
Advanced Example
mutation CopyProject {
  copyProject(
    input: {
      projectId: "proj_123abc"
      name: "Q2 Marketing Campaign"
      description: "Copy of Q1 campaign with updated timeline"
      imageURL: "https://example.com/campaign-logo.png"
      companyId: "comp_789xyz"
      options: {
        assignees: true
        automations: true
        checklists: true
        customFields: true
        discussions: false
        discussionComments: false
        dueDates: true
        files: true
        forms: true
        people: true
        projectUserRoles: true
        statusUpdates: false
        statusUpdateComments: false
        tags: true
        todoActions: true
        todoComments: false
        todoLists: true
        todos: true
      }
    }
  )
}
Input Parameters
CopyProjectInput
| Parameter | Type | Required | Description | 
|---|---|---|---|
projectId | 
String! | ✅ Yes | The ID of the project to be copied | 
name | 
String! | ✅ Yes | The name for the new project (max 50 characters) | 
description | 
String | No | The description for the new project (max 500 characters) | 
imageURL | 
String | No | The image URL for the new project | 
companyId | 
String | No | The ID of the company where the new project should be created. If not provided, uses the source project's company | 
options | 
CopyProjectOptionsInput! | ✅ Yes | Configuration for what elements to copy | 
CopyProjectOptionsInput
| Parameter | Type | Required | Description | 
|---|---|---|---|
assignees | 
Boolean | No | Copy task assignees (requires people: true) | 
automations | 
Boolean | No | Copy project automations and workflows | 
checklists | 
Boolean | No | Copy task checklists | 
customFields | 
Boolean | No | Copy custom field definitions and values | 
discussions | 
Boolean | No | Copy project discussions | 
discussionComments | 
Boolean | No | Copy comments on discussions (requires discussions: true) | 
dueDates | 
Boolean | No | Copy due dates on tasks | 
files | 
Boolean | No | Copy file attachments | 
forms | 
Boolean | No | Copy project forms | 
people | 
Boolean | No | Copy project members | 
projectUserRoles | 
Boolean | No | Copy user roles and permissions (requires people: true) | 
statusUpdates | 
Boolean | No | Copy project status updates | 
statusUpdateComments | 
Boolean | No | Copy comments on status updates (requires statusUpdates: true) | 
tags | 
Boolean | No | Copy project tags | 
todoActions | 
Boolean | No | Copy task actions/subtasks | 
todoComments | 
Boolean | No | Copy task comments | 
todoLists | 
Boolean | No | Copy task lists/sections | 
todos | 
Boolean | No | Copy tasks | 
coverConfig | 
Boolean | No | Copy todo cover image configuration | 
Response
The mutation returns a Boolean value:
true- The copy job has been successfully queuedfalse- The copy job could not be started
Checking Copy Status
Since copying is asynchronous, use the copyProjectStatus query to check progress:
Copy Status Fields
| Field | Type | Description | 
|---|---|---|
queuePosition | 
Int | Position in the copy queue | 
totalQueues | 
Int | Total number of items in the queue | 
isActive | 
Boolean | Whether the copy operation is currently active | 
oldProject | 
Project | The source project being copied | 
newProjectName | 
String | Name of the new project being created | 
isTemplate | 
Boolean | Whether this is copying as a template | 
oldCompany | 
Company | Source company | 
newCompany | 
Company | Target company | 
query CheckCopyStatus {
  copyProjectStatus {
    queuePosition
    totalQueues
    isActive
    oldProject {
      id
      name
    }
    newProjectName
    isTemplate
    oldCompany {
      id
      name
    }
    newCompany {
      id
      name
    }
  }
}
Required Permissions
To copy a project, you need appropriate permissions in both the source and target locations:
| Scenario | Required Permissions | 
|---|---|
| Copy within same company | OWNER, ADMIN, or MEMBER role in the source project | 
| Copy to different company | • OWNER, ADMIN, or MEMBER role in the source project• Must be a member of the target company  | 
The source project must be active (not archived) to be copied.
Error Responses
Project Not Found
{
  "errors": [{
    "message": "Record not found",
    "extensions": {
      "code": "PROJECT_NOT_FOUND"
    }
  }]
}
Occurs when the source project doesn't exist or you lack access.
Company Not Found
{
  "errors": [{
    "message": "Record not found",
    "extensions": {
      "code": "COMPANY_NOT_FOUND"
    }
  }]
}
Occurs when the target company doesn't exist or you lack access.
Project Too Large
{
  "errors": [{
    "message": "Project is too large to copy",
    "extensions": {
      "code": "CREATE_PROJECT_LIMIT"
    }
  }]
}
Occurs when the project has more than 250,000 tasks.
Copy Already In Progress
{
  "errors": [{
    "message": "Oops!"
  }]
}
Occurs when you already have a copy operation in progress.
Important Notes
- Asynchronous Operation: The mutation queues a background job and returns immediately. Use 
copyProjectStatusto track progress. - One Copy at a Time: Only one copy operation per user can be active at any time.
 - Size Limitations: Projects with more than 250,000 tasks cannot be copied.
 - Logical Dependencies: Some options work best together:
assigneesworks withpeople: true(assignees won't be copied without people)discussionCommentsworks withdiscussions: truestatusUpdateCommentsworks withstatusUpdates: trueprojectUserRolesworks withpeople: true
 - Name Processing: Project names are trimmed and any URLs are automatically removed.
 - Queue Priority: Enterprise customers receive higher priority in the copy queue.
 - Status Caching: Copy status is cached for 6 hours after completion.