Export Records

Export workspace records to a CSV file, with optional filters for assignees, tags, dates, and custom fields.


Export Records

The exportTodos mutation starts an asynchronous CSV export of records from a workspace. When the export finishes, a download link is emailed to the requesting user. Progress can be tracked in real time through the subscribeToImportExportProgress subscription.

For cross-workspace exports from a report, use the exportReport mutation instead.

Basic Example

Export all records from a workspace:

mutation ExportRecords {
  exportTodos(
    input: {
      projectId: "clm4n8qwx000008l0g4oxdqn7"
    }
  )
}

Advanced Example

Export filtered records using the optimized Rust-based exporter:

mutation ExportFilteredRecords {
  exportTodos(
    input: {
      projectId: "clm4n8qwx000008l0g4oxdqn7"
      useRustExport: true
      filter: {
        companyIds: ["org_abc123"]
        done: false
        assigneeIds: ["user_123", "user_456"]
        tagIds: ["tag_789"]
        dueStart: "2025-01-01T00:00:00Z"
        dueEnd: "2025-03-31T23:59:59Z"
        q: "launch"
        fields: [{ id: "cf_status_456", values: ["In Progress"] }]
        op: AND
      }
    }
  )
}

Input Parameters

ExportTodosInput

ParameterTypeRequiredDescription
projectIdString!YesID of the workspace to export records from
useRustExportBooleanNoUse the optimized Rust-based export pipeline (recommended for large workspaces)
filterTodosFilterNoFilter criteria to limit which records are exported. If omitted, all records are exported

TodosFilter

ParameterTypeRequiredDescription
companyIds[String!]!YesOrganization IDs to scope the export
projectIds[String!]NoAdditional workspace IDs to include
todoIds[String!]NoExport only these specific record IDs
assigneeIds[String!]NoFilter by assigned user IDs
unassignedBooleanNoWhen true, include only unassigned records
tagIds[String!]NoFilter by tag IDs
tagColors[String!]NoFilter by tag hex colors
tagTitles[String!]NoFilter by tag titles
todoListIds[String!]NoFilter by list IDs
todoListTitles[String!]NoFilter by list titles
doneBooleanNoFilter by completion status
showCompletedBooleanNoInclude completed records
startedAtDateTimeNoFilter records with a start date on or after this value
duedAtDateTimeNoFilter records with a due date on or before this value
dueStartDateTimeNoDue date range start
dueEndDateTimeNoDue date range end
duedAtStartDateTimeNoAlternative due date range start
duedAtEndDateTimeNoAlternative due date range end
updatedAt_gtDateTimeNoRecords updated after this timestamp
updatedAt_gteDateTimeNoRecords updated at or after this timestamp
searchStringNoFull-text search query
qStringNoQuick search query
excludeArchivedProjectsBooleanNoExclude records from archived workspaces
fieldsJSONNoCustom field filter conditions (array of { id, values } objects)
opFilterLogicalOperatorNoLogical operator for combining filters: AND (default) or OR
coordinatesJSONNoGeographic bounding box for map-view filtering

Response Fields

FieldTypeDescription
exportTodosBoolean!Returns true when the export job has been queued

The actual CSV file is delivered by email once the export completes. The email contains a download link that expires after 24 hours.

Export a Report

The exportReport mutation exports records across multiple workspaces that belong to a report.

Example

mutation ExportReport {
  exportReport(
    input: {
      reportId: "report_abc123"
    }
  )
}

ExportReportInput

ParameterTypeRequiredDescription
reportIdString!YesID of the report to export

Response Fields

FieldTypeDescription
exportReportBoolean!Returns true when the export job has been queued

Export a Chart

The exportChartCSV mutation exports the data behind a dashboard chart as a CSV file.

Example

mutation ExportChart {
  exportChartCSV(
    chartId: "chart_xyz789"
    filter: {
      assigneeIds: ["user_123"]
      done: false
    }
  )
}

Input Parameters

ParameterTypeRequiredDescription
chartIdID!YesID of the chart to export
filterTodoFilterInputNoOptional filter to scope the chart data

Response Fields

FieldTypeDescription
exportChartCSVBoolean!Returns true when the chart export job has been queued

Tracking Export Progress

Subscribe to real-time progress updates:

subscription TrackExportProgress {
  subscribeToImportExportProgress(
    projectId: "clm4n8qwx000008l0g4oxdqn7"
    userId: "user_123"
  )
}

See the Import/Export overview for the full subscription payload shape.

Required Permissions

OperationAccess LevelNotes
exportTodosMEMBER or aboveUser must be a member of the workspace
exportReportReport member or org memberUser must have access to the report
exportChartCSVOrg memberUser must belong to the organization that owns the dashboard

Error Responses

ProjectNotFoundError

{
  "errors": [{
    "message": "Project was not found.",
    "extensions": {
      "code": "PROJECT_NOT_FOUND"
    }
  }]
}

When: The workspace does not exist or the user is not a member.

ReportNotFoundError

{
  "errors": [{
    "message": "Report was not found.",
    "extensions": {
      "code": "REPORT_NOT_FOUND"
    }
  }]
}

When: The report does not exist or the user does not have access.

ChartNotFoundError

{
  "errors": [{
    "message": "Chart was not found.",
    "extensions": {
      "code": "CHART_NOT_FOUND"
    }
  }]
}

When: The chart does not exist or the user is not a member of the owning organization.

ChartAlreadyExportingError

{
  "errors": [{
    "message": "Chart is already being exported.",
    "extensions": {
      "code": "CHART_ALREADY_EXPORTING"
    }
  }]
}

When: A chart export for the same chart and user is already in progress. Chart exports are deduplicated for up to 6 hours.

Important Notes

  • Asynchronous Delivery: All export mutations return immediately. The CSV file is generated in the background and a download link is sent to the user’s email.
  • Download Link Expiry: Export download links expire after 24 hours.
  • Chart Export Deduplication: Only one chart export per chart per user can run at a time. Subsequent requests within 6 hours will be rejected.
  • Report Exports: Report exports combine records from all workspaces referenced by the report’s data sources, applying any report-level filters.
  • Large Exports: For workspaces with many records, enable useRustExport: true for significantly faster export times.