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

# Read table rows

> Read all rows in a table with pagination, filtering, and sorting.

Rows are returned as flat objects with column **slugs** as keys. The response
includes a `columns` map (slug → display name) so you can resolve human-readable
names. Cells with no value or in an errored state are omitted.

Supports CSV export via the `format` query parameter.




## OpenAPI

````yaml /openapi-v1.yaml get /tables/{tableId}/rows
openapi: 3.1.0
info:
  title: Origami API
  version: '1.0'
  description: >
    > **Deprecated.** v1 is superseded by the canonical

    > [v2 API](./openapi-v2) (four segments: Agents, Workspace, Sequences,

    > Account). v1 remains fully functional with **no removal date in this

    > release** — but new integrations should target v2. See the

    > [v1 → v2 migration guide](./api-v1-to-v2-migration): `GET /tables` →

    > `GET /api/v2/tables`, `GET /tables/:id/rows` →

    > `GET /api/v2/tables/:tableId/rows`, `POST /tables/:id/rows` →

    > `POST /api/v2/tables/:tableId/rows/upsert` (upsert; no bare insert),

    > `GET /batches/:id` → `GET /api/v2/batches/:batchId`, `GET /credits` →

    > `GET /api/v2/account/credits`.


    The Origami API lets you enrich company and people data programmatically.

    See the [Quickstart](/quickstart) for a walkthrough with curl examples.


    All write endpoints are **asynchronous** — a `POST` returns a `batchId`
    immediately.

    Poll `GET /batches/{batchId}` for progress and enriched results.


    ## Rate limits


    Limits apply in layers: **per IP** (all requests), **per organization**
    (after a valid API key), and an extra **insert** cap on row writes.


    | Scope | Limit |

    |-------|-------|

    | Per client IP | **300 requests / minute** |

    | Per organization (all endpoints) | **100 requests / minute** |

    | `POST /tables/{tableId}/rows` (per organization) | **10 requests /
    minute** |


    Each layer exposes its own response headers:
    `X-RateLimit-Limit-{IP|Global|Insert}`,

    `X-RateLimit-Remaining-{IP|Global|Insert}`, and
    `X-RateLimit-Reset-{IP|Global|Insert}` (Unix seconds).

    A request may include several of these when multiple layers apply.


    ## Request IDs


    Every response includes an `X-Request-Id` header. You can pass your own ID

    via the `X-Request-Id` request header (1–64 alphanumeric / dash / underscore

    characters); otherwise the server generates a UUID. Include this ID in
    support

    requests to help us trace issues.


    ## Errors


    All errors follow a consistent format:


    ```json

    {
      "error": "Human-readable error message",
      "code": "MACHINE_READABLE_CODE"
    }

    ```


    Some errors include additional context fields like `path`, `fields`, `hint`,
    `current`, `limit`, or `requested`.


    | Code | Status | Meaning |

    |------|--------|---------|

    | `UNAUTHORIZED` | 401 | Missing, invalid, revoked, or expired API key. |

    | `VALIDATION_ERROR` | 400 | Invalid request parameter or body. |

    | `NOT_FOUND` | 404 | Table or batch not found. |

    | `RATE_LIMITED` | 429 | Too many requests — see rate-limit headers. |

    | `INSUFFICIENT_CREDITS` | 402 | Not enough credits to complete the
    operation. |

    | `SUBSCRIPTION_REQUIRED` | 402 | Feature requires a plan upgrade. |

    | `INTERNAL_ERROR` | 500 | Unexpected server error. |


    ## Webhooks


    Receive sequencer events (sends, replies, connection acceptances) via

    HTTPS POST. Configure endpoints in **Settings → Developers → Webhooks**

    or read the [webhooks reference](/webhooks/overview). The full event

    catalog ships as [openapi-webhooks.yaml](/openapi-webhooks.yaml) so

    coding agents can author working receivers from the spec.
  contact:
    name: Origami Support
    url: https://origami.chat
  license:
    name: Proprietary
servers:
  - url: https://origami.chat/api/v1
    description: Production
security:
  - apiKey: []
tags:
  - name: Tables
    description: List tables and read row data.
  - name: Rows
    description: Insert rows and trigger enrichment.
  - name: Batches
    description: Poll async batch progress and retrieve results.
  - name: Credits
    description: Check your organization's credit balance.
paths:
  /tables/{tableId}/rows:
    get:
      tags:
        - Tables
      summary: Read table rows
      description: >
        Read all rows in a table with pagination, filtering, and sorting.


        Rows are returned as flat objects with column **slugs** as keys. The
        response

        includes a `columns` map (slug → display name) so you can resolve
        human-readable

        names. Cells with no value or in an errored state are omitted.


        Supports CSV export via the `format` query parameter.
      operationId: getTableRows
      parameters:
        - $ref: '#/components/parameters/tableId'
        - $ref: '#/components/parameters/page'
        - name: pageSize
          in: query
          schema:
            type: integer
            default: 50
            minimum: 1
            maximum: 500
          description: Number of rows per page (max 500).
        - name: filters
          in: query
          schema:
            type: string
          description: >
            JSON-encoded array of filter objects. Each filter uses a column
            **slug**

            (from `GET /tables`), an `operator`, and a `value`.


            Operators: `contains`, `not_contains`, `equals`, `not_equals`,

            `is_empty`, `is_not_empty`, `greater_than`, `greater_than_or_equal`,

            `less_than`, `less_than_or_equal`.


            When provided, the table's default filters are **replaced** by
            these.
          example: '[{"column":"website","operator":"is_not_empty","value":""}]'
        - name: sort
          in: query
          schema:
            type: string
          description: |
            JSON-encoded sort object with a column **slug** and direction.
            When provided, the table's default sort is **replaced** by this.
          example: '{"column":"quality-score","direction":"desc"}'
        - name: columns
          in: query
          schema:
            type: string
          description: |
            Comma-separated list of column slugs to include in the response.
            Omit to return all columns. Use slugs from `GET /tables`.
          example: company-name,website,quality-score
        - name: defaults
          in: query
          schema:
            type: string
            enum:
              - 'true'
              - 'false'
            default: 'true'
          description: |
            Whether to apply the table's saved filters and sort order (the same
            ones shown in the Origami dashboard). Set to `false` to get all rows
            unfiltered, in insertion order.
        - name: format
          in: query
          schema:
            type: string
            enum:
              - json
              - csv
            default: json
          description: Response format. Use `csv` for spreadsheet-compatible export.
      responses:
        '200':
          description: Rows retrieved successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RowsResponse'
              example:
                columns:
                  company-name: Company Name
                  website: Website
                  ceo-email: CEO Email
                rows:
                  - id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                    company-name: Acme Corp
                    website: acme.com
                    ceo-email: ceo@acme.com
                total: 1234
                page: 0
                pageSize: 50
            text/csv:
              schema:
                type: string
        '400':
          description: Invalid query parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalidFilters:
                  summary: Malformed filters JSON
                  value:
                    error: Invalid filters JSON
                    code: INVALID_FILTERS
                invalidSort:
                  summary: Malformed sort JSON
                  value:
                    error: Invalid sort JSON
                    code: INVALID_SORT
                unknownColumn:
                  summary: Filter or sort references an unknown column slug
                  value:
                    error: Unknown filter columns
                    code: UNKNOWN_COLUMN
                    columns:
                      - nonexistent-column
                validationError:
                  summary: Invalid filter operator or sort direction
                  value:
                    error: Invalid filter operator
                    code: VALIDATION_ERROR
                    operators:
                      - bad_operator
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/TableNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    tableId:
      name: tableId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: The table UUID. Use `GET /tables` to list available tables.
    page:
      name: page
      in: query
      schema:
        type: integer
        default: 0
        minimum: 0
      description: Zero-based page index.
  schemas:
    RowsResponse:
      type: object
      required:
        - columns
        - rows
        - total
        - page
        - pageSize
      properties:
        columns:
          type: object
          additionalProperties:
            type: string
          description: |
            Map of column slug → display name. Use this to resolve the slug keys
            in each row object to human-readable column names.
        rows:
          type: array
          items:
            $ref: '#/components/schemas/Row'
        total:
          type: integer
          description: Total number of rows matching the query (before pagination).
        page:
          type: integer
          description: Current page index (zero-based).
        pageSize:
          type: integer
          description: Number of rows per page.
    Error:
      type: object
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: Human-readable error message.
        code:
          type: string
          description: Machine-readable error code.
      additionalProperties: true
    Row:
      type: object
      required:
        - id
      properties:
        id:
          type: string
          format: uuid
          description: Row UUID.
      additionalProperties: true
      description: |
        Flat object with column **slugs** as keys. Values are strings, numbers,
        or arrays depending on column type. Cells with no value are omitted.
        Use the `columns` map in the response to resolve slugs to display names.
  responses:
    Unauthorized:
      description: Missing, invalid, revoked, or expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Invalid API key
            code: UNAUTHORIZED
    TableNotFound:
      description: Table not found or does not belong to this organization.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Table not found
            code: NOT_FOUND
    RateLimited:
      description: Rate limit exceeded.
      headers:
        X-RateLimit-Limit-IP:
          schema:
            type: integer
          description: IP bucket — maximum requests allowed in the window.
        X-RateLimit-Remaining-IP:
          schema:
            type: integer
          description: IP bucket — requests remaining in the current window.
        X-RateLimit-Reset-IP:
          schema:
            type: integer
          description: IP bucket — Unix timestamp when the window resets.
        X-RateLimit-Limit-Global:
          schema:
            type: integer
          description: Organization bucket — maximum requests allowed in the window.
        X-RateLimit-Remaining-Global:
          schema:
            type: integer
          description: Organization bucket — requests remaining in the current window.
        X-RateLimit-Reset-Global:
          schema:
            type: integer
          description: Organization bucket — Unix timestamp when the window resets.
        X-RateLimit-Limit-Insert:
          schema:
            type: integer
          description: >-
            Insert bucket — maximum requests allowed in the window (write routes
            only).
        X-RateLimit-Remaining-Insert:
          schema:
            type: integer
          description: Insert bucket — requests remaining in the current window.
        X-RateLimit-Reset-Insert:
          schema:
            type: integer
          description: Insert bucket — Unix timestamp when the window resets.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate limit exceeded
            code: RATE_LIMITED
    InternalError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Internal server error
            code: INTERNAL_ERROR
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: og_live_*
      description: |
        API key with `og_live_` prefix. Create keys in **Settings → API Keys**.

        Pass in the `Authorization` header:
        ```
        Authorization: Bearer og_live_abc123...
        ```

````