# ReportSpecInput

input type

The whole report spec: the plan (the SearchPlanInput grammar VERBATIM — its defaults apply, its `limit` bounds a projection's rows on the synchronous lane), then EXACTLY ONE of `columns` (1..24 — a projection) / `groupBy` (1..4 — an aggregate); `measures` (up to 8) ride ONLY with groupBy; an optional `sort`. Everything validates against the terminal family's roster BEFORE anything runs; a JSON null on an optional field reads as absent.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `plan` | [SearchPlanInput](/types/SearchPlanInput/) `SearchPlanInput!` | yes | No further notes. |
| `columns` | [String](/types/#scalars) `[String!]` | no | No further notes. |
| `groupBy` | [ReportGroupKeyInput](/types/ReportGroupKeyInput/) `[ReportGroupKeyInput!]` | no | No further notes. |
| `measures` | [ReportMeasureInput](/types/ReportMeasureInput/) `[ReportMeasureInput!]` | no | No further notes. |
| `sort` | [ReportSortInput](/types/ReportSortInput/) | no | No further notes. |

## Used by

- [reportRun](/reference/reading-your-records/reportRun/)
- [startExportJob](/reference/reading-your-records/startExportJob/)
