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.
adminViewBooleanNoReturn every report in the organization, not only yours and those shared with you. Honoured only for an OWNER or ADMIN of companyId.

Listing every report in an organization

adminView: true drops the created-by / shared-with restriction, so the list returns every report in companyId. Use it to reach reports left behind by people who have left the organization.

The server proves the caller’s membership rather than trusting the flag: it checks for an OWNER or ADMIN CompanyUser row in that same companyId. A caller who is neither is silently narrowed to their normal scope rather than refused — the query succeeds and simply returns their own visible reports. Because the check is against the requested organization, passing another organization’s id reaches nothing.

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).

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. An organization OWNER or ADMIN can pass adminView: true to widen the list to every report in that organization.

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