Copy Record

Duplicate a record into any list, choosing exactly which elements carry over.


Use the copyRecord mutation to duplicate an existing record into a target list, choosing exactly which elements (description, due date, checklists, assignees, tags, custom fields, comments) carry over to the copy. Records are Record objects in the API; lists are RecordList objects.

The copy is created in the destination list — which can belong to the same workspace or a different one — and is placed at the bottom of that list. Subtasks (todo actions) are always copied. The mutation returns Boolean!; on failure it throws an error rather than returning false.

Request

mutation CopyRecord {
  copyRecord(
    input: {
      todoId: "todo_123"
      todoListId: "list_123"
      title: "Copy of Q3 onboarding"
      options: [DESCRIPTION, DUE_DATE, CHECKLISTS, ASSIGNEES, TAGS, CUSTOM_FIELDS, COMMENTS]
    }
  )
}

Send these headers with the request. Company and project accept either an ID or a slug, and header names are case-insensitive.

blue-token-id: YOUR_TOKEN_ID
blue-token-secret: YOUR_TOKEN_SECRET
blue-org-id: YOUR_ORG_ID
blue-workspace-id: project_123

Parameters

CopyRecordInput

ParameterTypeRequiredDescription
todoIdString!YesID of the record to copy.
todoListIdString!YesID of the list to create the copy in. May be in the same workspace or a different one.
options[CopyRecordOption!]!YesWhich elements to copy from the source record. Pass an empty list [] to copy only the record’s title and subtasks.
titleStringNoTitle for the copy. Defaults to the source record’s title when omitted.
customFieldIds[String!]NoWhen options includes CUSTOM_FIELDS, restrict the copy to this subset of source custom-field IDs. Omit (or pass null) to copy every custom field.

CopyRecordOption

Each value in options opts a category of data into the copy. Anything not listed is not copied.

ValueDescription
DESCRIPTIONThe record’s description (text / html).
DUE_DATEThe due date and its timezone.
ASSIGNEESAssigned users. On a cross-workspace copy, assignees are filtered to users who are members of the destination workspace.
TAGSAssociated tags.
COMMENTSComments and their replies.
CHECKLISTSChecklists and their items.
CUSTOM_FIELDSCustom field values, including file attachments (duplicated to new storage references). Pair with customFieldIds to copy only specific fields.

Response

{
  "data": {
    "copyRecord": true
  }
}

Returns

FieldTypeDescription
copyRecordBoolean!true when the copy succeeds. Failures throw an error instead of returning false.

Errors

CodeWhen
TODO_NOT_FOUNDtodoId does not exist, or you lack OWNER / ADMIN / MEMBER access to its workspace.
TODO_LIST_NOT_FOUNDtodoListId does not exist, or you lack OWNER / ADMIN / MEMBER access to the destination workspace.
FORBIDDENYour role does not permit copying (e.g. VIEW_ONLY / COMMENT_ONLY), or a MEMBER attempted a cross-workspace copy.
PLAN_LIMIT_REACHEDThe destination workspace or organization has reached its record limit for the current plan.
{
  "errors": [
    {
      "message": "You are not authorized.",
      "extensions": {
        "code": "FORBIDDEN"
      }
    }
  ]
}

Permissions

You need edit access to both the source and destination workspaces. The role on the source workspace also governs whether the copy can cross workspaces.

RoleSame workspaceCross-workspace
OWNERYesYes
ADMINYesYes
MEMBERYesNo
COMMENT_ONLYNoNo
VIEW_ONLYNoNo

A MEMBER can only copy within the same workspace; a cross-workspace copy from a MEMBER returns FORBIDDEN. Cross-workspace copies also run any automations configured for records arriving from another workspace.