Query Reports

Fetch a single report by id or list the reports in an organization, with pagination and the full Report field reference.


Use the report query to fetch a single report by id, and the reports query to list the reports you can see in an organization. A report aggregates records (Todo objects) from one or more workspaces into a saved analytical view; these two queries read the report’s metadata and configuration. To read the records, counts, and aggregations a report produces, see Report Data & Aggregations.

Both queries are visibility-scoped: you only ever see a report you created or one that has been shared with you.

Request

Fetch one report by id with its data sources:

query GetReport {
  report(id: "report_123") {
    id
    title
    description
    lastGeneratedAt
    projectIds
    createdBy {
      fullName
    }
    dataSources {
      id
      name
      sourceType
      projectIds
      order
    }
  }
}

List the reports you can see in an organization, newest-updated first:

query ListReports {
  reports(filter: { companyId: "company_123" }, skip: 0, take: 20) {
    totalCount
    hasNextPage
    hasPreviousPage
    items {
      id
      title
      updatedAt
    }
  }
}

The organization is identified by companyId (accepts the organization ID or slug). The report query is identified by the report’s id.

Parameters

report arguments

ParameterTypeRequiredDescription
idString!YesThe report’s id. Returns null-equivalent behavior only via error — see Errors.

reports arguments

ParameterTypeRequiredDescription
filterReportFilter!YesScopes the list to one organization, with an optional creator filter.
skipIntNoNumber of reports to skip. Defaults to 0.
takeIntNoNumber of reports to return. Defaults to 20.

ReportFilter

FieldTypeRequiredDescription
companyIdString!YesThe organization (Company) to list reports for. Accepts ID or slug.
createdByIdStringNoRestrict the list to reports created by this user. Applied on top of the visibility scope.
Pagination is applied after the visibility scope

reports first loads every report you created or that was shared with you in the organization, sorts them by updatedAt descending, then applies createdById, skip, and take. totalCount reflects the count after filtering but before pagination; hasNextPage is skip + take < totalCount and hasPreviousPage is skip > 0.

Response

report:

{
  "data": {
    "report": {
      "id": "clm4n8qwx000008l0g4oxdqn7",
      "title": "Q3 Delivery Pipeline",
      "description": "Open work across the delivery workspaces.",
      "lastGeneratedAt": "2026-05-28T09:14:22.000Z",
      "projectIds": ["clm4projalpha0001", "clm4projbeta00002"],
      "createdBy": { "fullName": "Dana Reyes" },
      "dataSources": [
        {
          "id": "clm4dsrc00000abcd1234",
          "name": "Delivery",
          "sourceType": "TODOS",
          "projectIds": ["clm4projalpha0001", "clm4projbeta00002"],
          "order": 0
        }
      ]
    }
  }
}

reports:

{
  "data": {
    "reports": {
      "totalCount": 3,
      "hasNextPage": false,
      "hasPreviousPage": false,
      "items": [
        {
          "id": "clm4n8qwx000008l0g4oxdqn7",
          "title": "Q3 Delivery Pipeline",
          "updatedAt": "2026-05-28T09:14:22.000Z"
        },
        {
          "id": "clm4r2abc000108l0aaaa1111",
          "title": "Support Backlog",
          "updatedAt": "2026-05-21T16:02:10.000Z"
        },
        {
          "id": "clm4r9def000208l0bbbb2222",
          "title": "Marketing Calendar",
          "updatedAt": "2026-05-19T11:48:55.000Z"
        }
      ]
    }
  }
}

ReportPagination

FieldTypeDescription
items[Report!]!The page of reports, sorted by updatedAt descending.
totalCountInt!Total reports matching the filter, before skip/take.
hasNextPageBoolean!true when more reports exist after this page.
hasPreviousPageBoolean!true when skip is greater than 0.

Report

FieldTypeDescription
idID!Unique report identifier.
uidString!Short public-facing identifier.
titleString!Report name.
descriptionStringOptional description (up to 10,000 characters).
configJSONObjectOpaque key/value blob holding display configuration (selected fields, layout). Its shape is defined by the app, not the GraphQL schema.
companyCompany!The organization the report belongs to.
createdByUser!The user who created the report. Their workspace permissions are used to resolve the report’s records and project list.
createdAtDateTime!When the report was created.
updatedAtDateTime!When the report was last modified. Drives the reports sort order.
lastGeneratedAtDateTimeWhen the report’s aggregations were last invalidated/regenerated. null until first refresh. Bumped by refreshReportAggregations.
dataSources[ReportDataSource!]!The data sources that scope the report’s records.
reportUsers[ReportUser!]!Users the report is shared with, with their role. See Manage Report Access.
projectIds[String!]Computed union of every workspace ID across all data sources that the report creator can access. See the note below.

The Report type also exposes the todos, todoCount, and aggregations fields. Those are the report’s data surface and are documented on Report Data & Aggregations, which also covers the TodosFilter/TodosSort inputs (shared with the Records section).

projectIds is computed, not stored

Report.projectIds is derived at read time: it unions the workspaces from every data source, resolved against the report creator’s permissions. If any data source has projectIds: null (meaning “all workspaces”), the field returns every workspace the creator can access. Archived workspaces are excluded. This differs from ReportDataSource.projectIds, which reflects a single source’s stored scope.

ReportDataSource

FieldTypeDescription
idID!Unique data-source identifier.
uidString!Short public-facing identifier.
nameStringOptional label for the data source.
reportReport!The parent report.
sourceTypeReportSourceType!The kind of records this source pulls. Only TODOS exists today.
projectIds[String!]The workspaces this source scopes to. null means all workspaces the report creator can access; a non-empty array means those specific workspaces.
projects[Project!]The resolved workspaces for this source (all accessible workspaces when projectIds is null), sorted by name.
filtersJSONObjectOpaque record filter applied to this source. Mirrors the Records filter structure; its keys are defined by the app, not the GraphQL schema.
orderInt!Position of the source within the report.
createdAtDateTime!When the data source was created.
updatedAtDateTime!When the data source was last modified.

ReportSourceType

ValueDescription
TODOSThe source pulls records (Todo objects) from its workspaces. The only value today.

Errors

CodeWhen
REPORT_NOT_FOUNDThe id does not exist, or you are neither the creator nor a shared user of the report.
UNAUTHENTICATEDThe request has no valid credentials.

Both queries require an authenticated user. report raises REPORT_NOT_FOUND rather than returning null when the report is invisible to you, so a missing report and a forbidden one are indistinguishable by design. reports never errors on visibility — it simply omits reports you cannot see.

Permissions

Report visibility is per-report, independent of workspace membership:

  • report (view) — succeeds only if you are the report’s createdBy or appear in its reportUsers (with either EDITOR or VIEWER role).
  • reports (list) — returns every report in filter.companyId that you created or that was shared with you, sorted by updatedAt descending. Reports you cannot see are silently excluded; the createdById filter narrows this set further.

Modifying, deleting, and exporting reports have their own (different) access tiers — see Manage Report Access, Duplicate & Delete a Report, and Export a Report.