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

# Get Table Rows

> GET /v0/operator/mounts/{mountId}/tables/{slug}/rows — Paginate, filter, sort rows on a mount-scoped table

Read rows from a mount-scoped table — filtered, sorted, and paginated. Works on both workflow tables (mount-shared, tool-written) and memory tables (operator-private or team).

**Auth:** API key (agent) or user session (operator). Caller must own the mount or be a current team member.

## Path parameters

| Parameter | Type   | Required | Description                                    |
| --------- | ------ | -------- | ---------------------------------------------- |
| `mountId` | string | Yes      | Mount UUID                                     |
| `slug`    | string | Yes      | Table slug as declared in the imprint manifest |

## Query parameters

| Parameter       | Type    | Description                                                                                                                                           |
| --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `filter`        | string  | Filters as `key:value,key:value`, ANDed. The key may carry an operator suffix — `revenue[gte]:75`. Each key must be a column in the table schema      |
| `sort`          | string  | `column:asc` or `column:desc`. Type-aware: number columns sort numerically, date columns chronologically. Also accepts `createdAt`, `updatedAt`, `id` |
| `limit`         | number  | Default `100`, max `500`                                                                                                                              |
| `after`         | string  | Cursor: row UUID to start after                                                                                                                       |
| `before`        | string  | Cursor: row UUID to page backward from. Cannot be combined with `after`                                                                               |
| `fields`        | string  | Comma-separated columns to return in each row's `data`, e.g. `slug,title`                                                                             |
| `include_total` | boolean | `1` or `true` to also return `total`, the unpaginated count matching the filters                                                                      |

### Filter operators

| Operator              | Meaning                                                                        |
| --------------------- | ------------------------------------------------------------------------------ |
| *(none)*              | Equal — `status:new`                                                           |
| `lt` `lte` `gt` `gte` | Range — `composite_score[gte]:8`                                               |
| `ne`                  | Not equal. Uses `IS DISTINCT FROM`, so rows **missing** the column still match |
| `in`                  | Any of a comma-separated list — `status[in]:new,seen`                          |
| `contains` / `starts` | Case-insensitive substring / prefix match                                      |

Comparisons use the column's declared type, so `composite_score[gte]:8` compares
numerically and a `date` column compares chronologically.

<Warning>
  A `filter`, `sort`, or `fields` naming a column the table does not have returns
  `400` — it is not silently ignored. Previously a mistyped filter returned every
  row unfiltered.
</Warning>

## Response

```json theme={null}
{
  "ok": true,
  "data": [
    {
      "id": "f0c1e8e0-0000-0000-0000-000000000001",
      "data": {
        "url": "https://x.com/user/status/1001",
        "title": "Need an AI agent for support tickets",
        "composite_score": 8.6,
        "status": "new"
      },
      "createdAt": "2026-05-20T05:00:00.000Z",
      "createdBy": "rip1..."
    }
  ],
  "nextCursor": "f0c1e8e0-0000-0000-0000-00000000000a",
  "prevCursor": null
}
```

`nextCursor` is `null` when no further rows exist. `prevCursor` is `null` on the
first page. `total` is present only when `include_total` was requested.

Ordering is total — the `created_at, id` tie-break is guaranteed — so paging is
stable even when many rows share a sort value.

## Errors

| Status | Code                    | Cause                                                       |
| ------ | ----------------------- | ----------------------------------------------------------- |
| `403`  | `MOUNT_ACCESS_DENIED`   | Caller is neither the mount owner nor a current team member |
| `404`  | `MOUNT_NOT_FOUND`       | No mount with that id                                       |
| `404`  | `TABLE_NOT_MOUNTED`     | Slug does not match any materialized table on the mount     |
| `400`  | `INVALID_FILTER_COLUMN` | A filter names a column not in the table schema             |
| `400`  | `INVALID_SORT_COLUMN`   | A sort names a column not in the table schema               |
| `400`  | `INVALID_FIELD`         | `fields` names a column not in the table schema             |
| `400`  | `INVALID_FILTER`        | A filter key is malformed or uses an unknown operator       |
| `400`  | `INVALID_CURSOR`        | The cursor is not a row in this table                       |
| `400`  | `CONFLICTING_CURSORS`   | Both `after` and `before` were supplied                     |

## Example

```bash theme={null}
# Top-15 bid leads (only "new" status) sorted by composite score
curl -H "Authorization: Bearer rip_sk_..." \
  "https://api.tokenrip.com/v0/operator/mounts/a7c1.../tables/upwork-leads/rows?filter=status:new&sort=composite_score:desc&limit=15"
```

To page through a large result set, repeat the call with `after=<lastRowId>` from the previous response.
