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

# List rows

> Retrieve a paginated list of rows from a table.

## Path parameters

<ParamField path="table_id" type="string" required>
  The unique identifier of the table.
</ParamField>

## Query parameters

<ParamField query="page" type="integer" default="1">
  Page number for pagination.
</ParamField>

<ParamField query="limit" type="integer" default="25">
  Number of items per page (max 100).
</ParamField>

<ParamField query="sort_by" type="string">
  Column key to sort by. Sorts by the value in `extracted_data` for that column.
</ParamField>

<ParamField query="sort_order" type="string" default="asc">
  Sort direction: `asc` or `desc`.
</ParamField>

## Response

<ResponseField name="data" type="array">
  <Expandable title="Row object">
    <ResponseField name="id" type="string">Unique row identifier.</ResponseField>
    <ResponseField name="row_index" type="integer">Position of the row in the table.</ResponseField>
    <ResponseField name="data" type="object">Extracted data keyed by column key.</ResponseField>
    <ResponseField name="validation_status" type="string | null">Validation status.</ResponseField>
    <ResponseField name="validation_errors" type="object | null">Validation error details.</ResponseField>
    <ResponseField name="enhancement_status" type="object | null">Per-column enhancement status.</ResponseField>
    <ResponseField name="is_edited" type="boolean">Whether the row has been manually edited.</ResponseField>
    <ResponseField name="created_at" type="string">ISO 8601 timestamp.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="pagination" type="object">
  <Expandable title="Pagination metadata">
    <ResponseField name="page" type="integer">Current page.</ResponseField>
    <ResponseField name="limit" type="integer">Items per page.</ResponseField>
    <ResponseField name="total" type="integer">Total number of rows.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```typescript TypeScript theme={null}
  const result = await client.tables.rows("tbl_abc123", {
    page: 1,
    limit: 50,
    sort_by: "name",
  });

  for (const row of result.data) {
    console.log(row.data.name, row.data.price);
  }
  ```

  ```python Python theme={null}
  result = client.tables.rows("tbl_abc123", page=1, limit=50, sort_by="name")

  for row in result["data"]:
      print(row["data"]["name"], row["data"]["price"])
  ```

  ```bash cURL theme={null}
  curl -X GET "https://hub.banditshq.com/api/v1/tables/tbl_abc123/rows?page=1&limit=50&sort_by=name" \
    -H "Authorization: Bearer lasso_..."
  ```
</RequestExample>

<Tip>
  The Python SDK has a `results_as_dataframe` helper that fetches all rows and returns a pandas DataFrame:

  ```python theme={null}
  df = client.tables.results_as_dataframe("tbl_abc123")
  print(df.head())
  ```
</Tip>

<ResponseExample>
  ```json Response theme={null}
  {
    "data": [
      {
        "id": "row_abc123",
        "row_index": 0,
        "data": {
          "product_name": "iPhone 15 Pro",
          "price": 999,
          "description": "Latest Apple smartphone"
        },
        "validation_status": null,
        "validation_errors": null,
        "enhancement_status": null,
        "is_edited": false,
        "created_at": "2025-03-10T14:30:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 42
    }
  }
  ```
</ResponseExample>
