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

# Get Result Rows

> Filter and page through records in a stored tool result.

Reads a `records`-shaped result. You can use the following query parameters to filter, trim, and page through the records:

| Query | Meaning |
| - | - |
| `pointer` | JSON Pointer (`/` prefix) into the stored value. Defaults to the envelope `recordsPointer`. Depth is at most 8. |
| `select` | Comma-separated field names to return for each record, at most 32. |
| `where` | Repeatable filter clause in the format `field:operator:value`, at most 8. See [Filtering with `where`](#filtering-with-where). |
| `pageSize` | Integer from 1 to 100. Default 50. |
| `continuationToken` | `paging.continuationToken` from the previous page. |

```javascript theme={null}
const params = new URLSearchParams({
  select: "id,name",
  pageSize: "50",
});
params.append("where", "status:eq:open");

const response = await fetch(
  `https://agentos.useparagon.com/api/tools/projects/${projectId}/results/${resultId}/rows?${params}`,
  { headers: { Authorization: `Bearer ${paragonUserToken}` } },
);
```

## Filtering with `where`

`where` does not use a query language like SQL or OData. Each filter is a single colon-separated string, and you pass one `where` query parameter per filter.

### Clause format

```text theme={null}
field:operator:value
```

| Part | Description |
| - | - |
| `field` | The name of a top-level key on each record, such as `status` or `Amount`. Field names are case-sensitive. Nested paths like `owner.name` are not supported, and a field name cannot contain a `:`. |
| `operator` | One of the [operators](#operators) below. Operators are lowercase and case-sensitive. |
| `value` | The value to compare against. Always written as text, with no quotes. Everything after the second `:` is the value, so values can contain colons, such as `createdAt:gte:2026-01-01T00:00:00Z`. Omit it for `exists`. |

Values are not trimmed, quoted, or split on commas, so `name:eq: Acme` matches a leading space. Remember to URL-encode each clause when you build the query string. `URLSearchParams` does this for you.

### Combining filters

Repeat the `where` parameter to add more filters. A record is returned only if it matches **every** clause (logical AND). There is no OR or NOT, and you can use at most 8 clauses per request.

```text theme={null}
GET .../rows?where=status:eq:open&where=amount:gte:1000&where=name:contains:Acme
```

To express an OR, make one request for each alternative and merge the results in your agent.

### Operators

| Operator | Matches when | Needs a value |
| - | - | - |
| `eq` | The field equals the value. | Yes |
| `ne` | The field does not equal the value. Records that are missing the field also match. | Yes |
| `gt` | The field is greater than the value. | Yes |
| `gte` | The field is greater than or equal to the value. | Yes |
| `lt` | The field is less than the value. | Yes |
| `lte` | The field is less than or equal to the value. | Yes |
| `contains` | The field, read as text, contains the value as a case-sensitive substring. | Yes |
| `exists` | The field is present and is not `null`. | No |

### How values are compared

Because every value in the query string is text, the comparison depends on what the field and the value look like:

* **Numbers.** If a field is a number, or a string that parses as a number (like `"10"` or `"1e3"`), and the value also parses as a number, they are compared numerically. `Amount:eq:10.0` matches `10`, and `Amount:gt:9` matches `"10"`. Numeric strings are converted to numbers, so identifiers like `"00123"` and `"123"` are treated as equal.
* **Strings.** If either side is not numeric, `eq` and `ne` compare the text exactly (case-sensitive). `gt`, `gte`, `lt`, and `lte` compare strings alphabetically when both sides are non-numeric. This works for ISO 8601 timestamps in the same format and time zone, such as `createdAt:gte:2026-01-01T00:00:00Z`, but it does not work for formats that don't sort alphabetically, like `01/02/2026`.
* **Booleans.** Compare against the text `true` or `false`, such as `archived:eq:false`. Ordering operators never match booleans.
* **Empty and missing values.** `gt`, `gte`, `lt`, and `lte` never match when the field is missing, `null`, empty, a boolean, an object, or an array, or when the value is empty or can't be compared to the field (such as `Amount:gt:abc` against a numeric field). `contains` never matches a missing or `null` field, or an empty value. `eq` with an empty value (`name:eq:`) only matches fields that are an empty string.
* **Objects and arrays.** Comparison operators are meant for scalar fields. Use `exists` to check that a nested value is present, and use `select` to read it.

### Filtering and selecting together

Filters run before `select` and paging, so you can filter on a field you do not return. `select` only controls which fields appear in each record in `data`; fields that are not on a record are omitted.

```javascript theme={null}
const params = new URLSearchParams({ select: "id,name", pageSize: "25" });
params.append("where", "status:eq:open");
params.append("where", "amount:gte:1000");
params.append("where", "closedAt:exists");
```

### Paging through filtered results

`matched` is the total number of records that match your filters across all pages, not only the page returned. When `paging.continuationToken` is not `null`, there are more matches. Pass it as `continuationToken` on the next request.

A continuation token is tied to the `pointer`, `select`, and `where` clauses (in the same order) of the request that created it. If you change any of them, the request fails with `RESULT_SLICE_INVALID`. Start a new query without a token when you want different filters.

### Errors

An invalid request returns `400` with the error code `RESULT_SLICE_INVALID` and a message describing the problem. Common causes:

| Message | Cause |
| - | - |
| `Invalid where clause "..."` | The clause is missing a field or an operator, such as `status` or `:eq:open`. |
| `Unknown filter operator "..."` | The operator is not one of the eight listed above, or is not lowercase. |
| `where exceeds 8 clauses.` | More than 8 `where` parameters were sent. |
| `The continuation token is invalid.` | The token was altered, or was created with a different `pointer`, `select`, or `where`. |


## OpenAPI

````yaml agent-os/openapi/tools.json GET /api/tools/projects/{projectId}/results/{resultId}/rows
openapi: 3.1.0
info:
  title: Agent OS Tools API
  version: 1.0.0
  description: Enable your agent to take action in 130+ different apps with Agent OS Tools.
servers:
  - url: https://agentos.useparagon.com
    description: Production US Cloud
  - url: https://agentos.eu.paragon.so
    description: Production EU Cloud
security:
  - bearerAuth: []
paths:
  /api/tools/projects/{projectId}/results/{resultId}/rows:
    get:
      summary: Get Result Rows
      operationId: getResultRows
      parameters:
        - $ref: '#/components/parameters/ProjectId'
        - name: resultId
          in: path
          required: true
          schema:
            type: string
        - name: pointer
          in: query
          schema:
            type: string
          description: RFC 6901 JSON Pointer. Must start with /.
        - name: select
          in: query
          schema:
            type: string
          description: Comma-separated fields, at most 32.
        - name: where
          in: query
          schema:
            type: array
            items:
              type: string
          style: form
          explode: true
          description: >-
            Repeatable filter in the format field:operator:value, at most 8.
            Clauses are combined with AND. field is a top-level record key.
            Operators (lowercase): eq, ne, gt, gte, lt, lte, contains, exists.
            Everything after the second colon is the value, and exists takes no
            value. Example: status:eq:open.
        - name: pageSize
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: continuationToken
          in: query
          schema:
            type: string
      responses:
        '200':
          description: One page of records.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - paging
                  - matched
                  - tokenBudget
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
                  paging:
                    type: object
                    required:
                      - pageSize
                      - continuationToken
                    properties:
                      pageSize:
                        type: integer
                      continuationToken:
                        oneOf:
                          - type: string
                          - type: 'null'
                  matched:
                    type: integer
                  tokenBudget:
                    type: object
                    required:
                      - fullOutputTokens
                      - returnedTokens
                      - savedTokens
                    properties:
                      fullOutputTokens:
                        type: integer
                      returnedTokens:
                        type: integer
                      savedTokens:
                        type: integer
              example:
                data:
                  - id: '1'
                    name: Open issue
                paging:
                  pageSize: 50
                  continuationToken: null
                matched: 1
                tokenBudget:
                  fullOutputTokens: 20
                  returnedTokens: 8
                  savedTokens: 12
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
components:
  parameters:
    ProjectId:
      name: projectId
      in: path
      required: true
      schema:
        type: string
        format: uuid
  responses:
    Error:
      description: Error envelope.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: REQUEST_INVALID
              message: The request payload failed validation.
              hint: Correct the fields named in details and retry.
              retryable: false
              requestId: req_01hxyz
              details:
                - field: query
                  issue: query should not be empty
  schemas:
    ErrorEnvelope:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - hint
            - retryable
            - requestId
          properties:
            code:
              type: string
            message:
              type: string
            hint:
              type: string
            retryable:
              type: boolean
            retryAfterMs:
              type: integer
            requestId:
              type: string
            details:
              type: array
              items:
                type: object
                required:
                  - field
                  - issue
                properties:
                  field:
                    type: string
                  issue:
                    type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Your [Paragon User
        Token](/getting-started/installing-the-connect-sdk#setup) (JWT), which
        you can generate using your project's signing keys.

````