Export Records

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


Use the exportRecords mutation to start an asynchronous CSV export of records from a workspace. The mutation returns immediately with true to confirm the job was queued; the finished CSV is emailed to the requesting user as a download link. There is no API-returned URL — the emailed link is the only way to fetch the file. Track progress in real time with the subscribeToImportExportProgress subscription. (Records are Record objects in the API; a workspace is a Workspace.)

This page also covers two related exports:

  • exportReport — export records across every workspace referenced by a report’s data sources.
  • exportChartCSV — export the underlying data of a dashboard chart.
Exports are rate-limited

exportRecords and exportReport are limited to 1 request per 50 seconds per token (GraphQL Shield rate limiter). A second export call inside that window is rejected with RATE_LIMITED. Wait at least 50 seconds between exports.

Request

Export all records from a workspace. Only projectId is required.

mutation ExportRecords {
  exportRecords(input: { projectId: "project_123" })
}

projectId accepts a workspace ID or slug.

Parameters

ExportRecordsInput

ParameterTypeRequiredDescription
projectIdString!YesID or slug of the workspace to export records from.
filterTodosFilterNoCriteria to limit which records are exported. If omitted, all records in the workspace are exported.
useRustExportBooleanNoDeprecated — no longer used; has no effect. The resolver ignores this field.

TodosFilter

Combine any of these fields to narrow the export. Unless noted, fields are ANDed together.

ParameterTypeRequiredDescription
companyIds[String!]!YesOrganization IDs that scope the export. Required by the type even though the workspace is already given by projectId.
projectIds[String!]NoAdditional workspace IDs to include.
todoIds[String!]NoExport only these specific record IDs.
assigneeIds[String!]NoInclude records assigned to any of these users.
unassignedBooleanNoWhen true, include only records with no assignee.
tagIds[String!]NoInclude records carrying any of these tag IDs.
tagColors[String!]NoInclude records carrying a tag of any of these hex colors.
tagTitles[String!]NoInclude records carrying a tag with any of these titles.
todoListIds[String!]NoInclude records in any of these lists (by ID).
todoListTitles[String!]NoInclude records in any of these lists (by title).
doneBooleanNoFilter by completion status (true = completed).
showCompletedBooleanNoInclude completed records in the result set.
startedAtDateTimeNoInclude records started on or after this timestamp.
duedAtDateTimeNoInclude records due on or before this timestamp.
dueStartDateTimeNoDue-date range start.
dueEndDateTimeNoDue-date range end.
duedAtStartDateTimeNoAlternative due-date range start.
duedAtEndDateTimeNoAlternative due-date range end.
createdStartDateTimeNoInclude records created on or after this timestamp.
createdEndDateTimeNoInclude records created on or before this timestamp.
updatedAt_gtDateTimeNoInclude records updated after this timestamp.
updatedAt_gteDateTimeNoInclude records updated at or after this timestamp.
notAssigneeIds[String!]NoExclude records assigned to any of these users.
notTagIds[String!]NoExclude records carrying any of these tag IDs.
notColors[String!]NoExclude records of any of these colors.
notTodoListIds[String!]NoExclude records in any of these lists.
hasTagBooleanNoWhen true, include only records that have at least one tag.
hasColorBooleanNoWhen true, include only records that have a color set.
hasDueDateBooleanNoWhen true, include only records that have a due date.
hasDescriptionBooleanNoWhen true, include only records that have a description.
hasChecklistBooleanNoWhen true, include only records that have a checklist.
hasDependencyBooleanNoWhen true, include only records that have a dependency.
hasReferenceBooleanNoWhen true, include only records that have a reference.
searchStringNoFull-text search query.
qStringNoQuick search query (matches the record title).
excludeArchivedProjectsBooleanNoWhen true, exclude records from archived workspaces.
fieldsJSONNoCustom-field filter conditions. See custom-field filters.
opFilterLogicalOperatorNoLogical operator applied to the fields conditions. Defaults to AND.
coordinatesJSONNoGeographic bounding box for map-view filtering (raw JSON; no fixed schema).
groups[TodoFilterGroupInput!]NoNested filter groups. When provided, the flat fields above are ignored in favor of the groups.
groupLinks[FilterLogicalOperator!]NoOperators linking adjacent groups; length should be groups.length - 1. If shorter, the last operator is repeated.

FilterLogicalOperator

ValueDescription
ANDAll conditions must match (the default).
ORAny condition may match.

Custom-field filters

Each entry in the fields array must include a type — the query layer routes on it, and entries without type are silently dropped. The most common type is CUSTOM_FIELD:

[
  {
    "type": "CUSTOM_FIELD",
    "customFieldId": "field_123",
    "customFieldType": "CHECKBOX",
    "op": "IS",
    "values": true
  }
]

Other valid type values are TIME_IN_LIST, RELATIVE_DUEDATE, and FIELD. The operators available per customFieldType depend on the field type.

Response

exportRecords returns a bare boolean — true once the job is queued. The CSV is generated in the background and emailed to the requesting user; the API never returns the file or a URL.

{ "data": { "exportRecords": true } }

Returns

FieldTypeDescription
exportRecordsBoolean!true when the export job has been queued.

Full example

Export incomplete records assigned to two users, tagged, due in Q1, matching a search term and a custom-field value:

mutation ExportFilteredRecords {
  exportRecords(
    input: {
      projectId: "project_123"
      filter: {
        companyIds: ["company_123"]
        done: false
        assigneeIds: ["user_123", "user_456"]
        tagIds: ["tag_123"]
        dueStart: "2026-01-01T00:00:00Z"
        dueEnd: "2026-03-31T23:59:59Z"
        q: "launch"
        fields: [
          {
            type: "CUSTOM_FIELD"
            customFieldId: "field_123"
            customFieldType: "SELECT_SINGLE"
            op: "IS"
            values: ["option_123"]
          }
        ]
        op: AND
      }
    }
  )
}

Export a report

Use the exportReport mutation to export records across every workspace referenced by a report’s data sources. The export combines the records from all of those workspaces and applies any report-level filters; like exportRecords, it returns true and delivers the CSV by email.

mutation ExportReport {
  exportReport(input: { reportId: "report_123" })
}
{ "data": { "exportReport": true } }

ExportReportInput

ParameterTypeRequiredDescription
reportIdString!YesID of the report to export.

Export a chart

Use the exportChartCSV mutation to export the underlying data of a dashboard chart as a CSV file. It returns true and emails the file to the requesting user.

mutation ExportChart {
  exportChartCSV(chartId: "chart_123", filter: { assigneeIds: ["user_123"], showCompleted: false })
}
{ "data": { "exportChartCSV": true } }
ParameterTypeRequiredDescription
chartIdID!YesID of the chart to export.
filterTodoFilterInputNoFilter to scope the chart data before export.

TodoFilterInput

The chart filter is a different type from TodosFilter (which exportRecords uses). TodoFilterInput has no companyIds, todoIds, search, startedAt, duedAt, coordinates, or excludeArchivedProjects; instead it uses colors, and adds completed-date and last-updated-by axes. Fields shared with TodosFilter (assigneeIds, tagIds, showCompleted, q, …) behave the same — but a key like companyIds is not accepted here.

ParameterTypeRequiredDescription
assigneeIds[String!]NoInclude records assigned to any of these users.
unassignedBooleanNoWhen true, include only unassigned records.
colors[String!]NoInclude records of any of these colors.
dueStartDateTimeNoDue-date range start.
dueEndDateTimeNoDue-date range end.
showCompletedBooleanNoInclude completed records.
projectIds[String!]NoScope to these workspace IDs.
qStringNoQuick search query.
tagIds[String!]NoInclude records carrying any of these tag IDs.
tagColors[String!]NoInclude records carrying a tag of any of these hex colors.
tagTitles[String!]NoInclude records carrying a tag with any of these titles.
todoListIds[String!]NoInclude records in any of these lists (by ID).
todoListTitles[String!]NoInclude records in any of these lists (by title).
updatedAt_gtDateTimeNoInclude records updated after this timestamp.
updatedAt_gteDateTimeNoInclude records updated at or after this timestamp.
createdStartDateTimeNoInclude records created on or after this timestamp.
createdEndDateTimeNoInclude records created on or before this timestamp.
completedStartDateTimeNoInclude records completed on or after this timestamp.
completedEndDateTimeNoInclude records completed on or before this timestamp.
recordNameStringNoFilter by record title (full-text match).
recordNameOpFilterComparisonOperatorNoComparison operator applied to recordName.
notAssigneeIds[String!]NoExclude records assigned to any of these users.
notTagIds[String!]NoExclude records carrying any of these tag IDs.
notColors[String!]NoExclude records of any of these colors.
notTodoListIds[String!]NoExclude records in any of these lists.
hasTag / hasColor / hasDueDate / hasDescription / hasChecklist / hasDependency / hasReferenceBooleanNoExistence filters; when true, include only records that have the named attribute.
lastUpdatedByUserIds[String!]NoInclude records last updated by any of these users.
lastUpdatedByAutomationIds[String!]NoInclude records last updated by any of these automations.
lastUpdatedByActorTypes[ActorType!]NoInclude records last updated by any of these actor types.
fieldsJSONNoCustom-field filter conditions (same shape as above; each entry needs a type).
opFilterLogicalOperatorNoLogical operator for the fields conditions. Defaults to AND.
groups[TodoFilterGroupInput!]NoNested filter groups; when provided, the flat fields above are ignored.
groupLinks[FilterLogicalOperator!]NoOperators linking adjacent groups.

Track export progress

Subscribe to subscribeToImportExportProgress to receive real-time progress for the current user’s imports and exports. The subscription filters server-side by userId, so pass the ID of the user who started the export.

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

The subscription resolves a JSON payload. For exports, the worker publishes events shaped like this:

{
  "data": {
    "subscribeToImportExportProgress": {
      "type": "EXPORT",
      "userId": "user_123",
      "username": "Casey",
      "projectName": "Q1 Launch",
      "status": "COMPLETE",
      "progress": 100,
      "fileUrl": "https://api.blue.app/uploads/export-1234/q1-launch-export-1430290126.csv",
      "totalCount": 482
    }
  }
}

On failure the event carries "status": "ERROR", "progress": 0, and an error message instead of fileUrl/totalCount. See the Import/Export overview for the import-side payload.

Errors

CodeWhen
PROJECT_NOT_FOUNDexportRecords: the workspace does not exist, or the requesting user is not a member of it (membership is part of the lookup).
REPORT_NOT_FOUNDexportReport: the report does not exist or the user has no access to it.
CHART_NOT_FOUNDexportChartCSV: the chart does not exist, or the user is not a member of the organization that owns the dashboard.
CHART_ALREADY_EXPORTINGexportChartCSV: an export for the same (chartId, userId) pair is already in flight.
RATE_LIMITEDexportRecords / exportReport: more than one export request was made within 50 seconds by the same token.
FORBIDDENThe caller lacks the required role for the operation (see Permissions), or exportReport is called by an organization without the Reports plan feature.

exportReport also throws a generic (untyped) error — No valid projects found in report data sources — when the report’s data sources resolve to zero accessible workspaces. This surfaces with no extensions.code.

Permissions

OperationRequired accessOther requirements
exportRecordsProject OWNER, ADMIN, or MEMBERThe workspace must be active; rate-limited to 1 request per 50s.
exportReportCompany OWNER, ADMIN, or MEMBERThe organization must have the Reports plan feature; rate-limited to 1 request per 50s.
exportChartCSVCompany OWNER, ADMIN, or MEMBERVIEW_ONLY and COMMENT_ONLY company members are excluded.

Notes

  • Delivery is email-only. Every export here returns a bare true; the CSV is generated in the background and a download link is emailed to the requesting user. There is no programmatic way to fetch the file from the API.
  • Checklists are included. The exportTodos CSV carries a Checklists column (after Project, before custom-field columns) holding each record’s checklist items, with [x] for done items and [ ] for open ones — for example Topics: Acid-Base [x], Blood Product [ ]. Records with no checklists leave the cell empty. This applies to the CSV export only; the PDF export is unaffected.
  • Chart export deduplication. exportChartCSV sets a lock keyed by (chartId, userId) for 6 hours (21,600 s) on each accepted request. A repeat request for the same chart by the same user inside that window is rejected with CHART_ALREADY_EXPORTING. The 6-hour window restarts from the most recently accepted export.
  • Report exports combine data sources. exportReport resolves every workspace referenced by the report’s data sources (with per-user permission checks) and merges their filters before queuing one export.