> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qobra.co/llms.txt
> Use this file to discover all available pages before exploring further.

# get_report_pivot_data

Return a report's computed pivot-table cells — its cross-tabulated values.

For a report configured as a pivot table (see `get_report`'s
`pivot_configuration`): returns the row groups, the column groups, the
measures, and the flattened cells (one per row-path × column-path × measure),
respecting the caller's visibility. `__total__` in a path marks a subtotal or
grand-total. For a flat (non-pivot) report, use `get_report_data` instead —
calling this on a report with no pivot configuration raises a clear error.

Paginated like every list tool: `limit` caps the number of cells per call,
`offset` walks the pages (`next_offset` is `null` on the last one),
`total_cell_count` is the full size. A page holds whole pivot rows, so it may
return slightly fewer cells than `limit` (never more), and always at least one
row. A pivot too large to compute on the fly raises an actionable error. You
only see reports you have access to.

## Parameters

<Accordion title="Body" defaultOpen>
  <ParamField body="report" type="string" required>
    The report to read. Accepts the report's ObjectId (the id returned by
    list\_reports) or a case- and accent-insensitive substring of its name. A
    name matching no — or more than one — report raises a clear error; pass the
    full id to disambiguate.
  </ParamField>

  <ParamField body="limit" type="integer">
    Page size, between 1 and 250. Defaults to 50.
  </ParamField>

  <ParamField body="offset" type="integer">
    Row offset into the result set — the number of rows to skip before this
    page. Pass the next\_offset returned by the previous call, or None for the
    first page.
  </ParamField>
</Accordion>

## Response

<Accordion title="Body" defaultOpen>
  <ResponseField name="report_id" type="string" />

  <ResponseField name="resource_url" type="string">
    Deep link to open this report in the Qobra web app.
  </ResponseField>

  <ResponseField name="row_groups" type="object[]">
    The fields laid out on rows, outermost first.

    <Expandable title="object properties">
      <ResponseField name="field_id" type="string" />

      <ResponseField name="field_name" type="string" />

      <ResponseField name="value_type" type="string">
        One of: `number`, `boolean`, `date`, `string`.
      </ResponseField>

      <ResponseField name="field_type" type="string">
        One of: `float`, `amount`, `percentage`, `string`, `picklist`,
        `multipicklist`, `bool`, `date`, `user`, `object`, `group`,
        `record_status`.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="column_groups" type="object[]">
    The fields laid out on columns, outermost first.

    <Expandable title="object properties">
      <ResponseField name="field_id" type="string" />

      <ResponseField name="field_name" type="string" />

      <ResponseField name="value_type" type="string">
        One of: `number`, `boolean`, `date`, `string`.
      </ResponseField>

      <ResponseField name="field_type" type="string">
        One of: `float`, `amount`, `percentage`, `string`, `picklist`,
        `multipicklist`, `bool`, `date`, `user`, `object`, `group`,
        `record_status`.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="measure_groups" type="object[]">
    <Expandable title="object properties">
      <ResponseField name="measure_field_id" type="string" />

      <ResponseField name="measure_name" type="string" />

      <ResponseField name="value_type" type="string">
        One of: `number`, `boolean`, `date`, `string`.
      </ResponseField>

      <ResponseField name="field_type" type="string">
        One of: `float`, `amount`, `percentage`, `string`, `picklist`,
        `multipicklist`, `bool`, `date`, `user`, `object`, `group`,
        `record_status`.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="cells" type="object[]">
    One cell per row-path × column-path × measure; `__total__` in a path marks
    a subtotal/grand-total position.

    <Expandable title="object properties">
      <ResponseField name="row_path" type="any[]" />

      <ResponseField name="column_path" type="any[]" />

      <ResponseField name="measure_field_id" type="string" />

      <ResponseField name="value" type="any" />
    </Expandable>
  </ResponseField>

  <ResponseField name="cell_count_returned" type="integer" />

  <ResponseField name="total_cell_count" type="integer" />

  <ResponseField name="next_offset" type="integer">
    Row offset for the next page — pass it back as `offset` to fetch the
    following cells. `null` on the last page.
  </ResponseField>
</Accordion>
