Oneprofile Table Export API

Endpoint for downloading a table's rows as CSV.

GitHub OpenAPI

Operations 1

POST /tables/{table_id}/rows/export/ Export table rows as a CSV or Excel file #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/getoneprofile-ai:getoneprofile-ai-table-export-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

getoneprofile-ai-table-export-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: support@getoneprofile.ai
    name: Oneprofile Support
  description: REST API reference for Oneprofile, the GTM data layer for your CRM. Manage tables, enrichments, and integrations. Authenticate with an API key to get started.
  termsOfService: https://www.getoneprofile.ai/terms
  title: Reference | Oneprofile Table Export API
  version: 1.0.42765316646
tags:
- description: Endpoint for downloading a table's rows as CSV.
  name: table-export
paths:
  /tables/{table_id}/rows/export/:
    post:
      description: 'Download a table''s rows as a file. Two scopes: send `sorts`/`where`/`column_ids` to export what the grid is currently showing (leaving out `except_record_ids`), or `record_ids` to export a specific row selection. The two are mutually exclusive.


        `format` picks the file, and it changes how values are written. A CSV holds everything as text: timestamps in ISO 8601, lists and objects as JSON, so the file round-trips back through an import. Free-text cells are neutralised against spreadsheet formula injection; numbers are not, so they stay summable.


        An .xlsx keeps native types instead, so a number stays summable, a date sorts as a date and a checkbox is a real boolean. Nothing needs neutralising there, because a string cell is never evaluated as a formula.


        A CSV streams synchronously in keyset pages, so a large export starts downloading immediately. A workbook is a zip and cannot be streamed, so it is built in full before the response begins.'
      operationId: export_table_rows
      parameters:
      - in: path
        name: table_id
        required: true
        schema:
          format: uuid
          title: Table Id
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TableExportRequestSchema'
        required: true
      responses:
        '200':
          content:
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet: {}
            text/csv: {}
          description: The table as a CSV or Excel file.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
          description: Unauthorized
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenResponse'
          description: Forbidden
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundResponse'
          description: Table not found
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnprocessableEntityResponse'
          description: Invalid request made to the API.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServerErrorResponse'
          description: Internal server error.
        '502':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServerErrorResponse'
          description: Bad gateway error.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServerErrorResponse'
          description: Service unavailable.
      security:
      - APIKeyHeader: []
      - HTTPBearer: []
      summary: Export table rows as a CSV or Excel file
      tags:
      - table-export
components:
  schemas:
    UnprocessableEntityIssue:
      properties:
        input:
          anyOf:
          - type: string
          - type: integer
          - type: number
          - type: boolean
          - items: {}
            type: array
          - additionalProperties: true
            type: object
          description: The user's input that caused the error.
          title: Input
        loc:
          description: The location of the error. Always contains 1 or 2 elements. The first element is the type of location (e.g. 'body', 'query', 'path', 'header'). The second element is the name of the field that caused the error. If the error is not related to a specific field, the second element is not present.
          items:
            type: string
          title: Loc
          type: array
        msg:
          description: The message of the error. The error message to show to the user.
          title: Msg
          type: string
        type:
          description: The type of the error. Useful for frontend code to handle different types of errors.
          title: Type
          type: string
      required:
      - loc
      - msg
      - type
      - input
      title: UnprocessableEntityIssue
      type: object
    UnprocessableEntityResponse:
      properties:
        detail:
          description: The detail of the error. This is the error message to show to the user. You should also use the issues field to show more detailed error messages per field. Use this field for a single liner error message.
          title: Detail
          type: string
        issues:
          description: The issues that caused the error. There can be multiple issues. Each issue is a user-facing error message.
          items:
            $ref: '#/components/schemas/UnprocessableEntityIssue'
          title: Issues
          type: array
      required:
      - detail
      - issues
      title: UnprocessableEntityResponse
      type: object
    TableRowFilterSchema-Input:
      description: 'One predicate a row must satisfy.


        Which operators apply depends on the column''s type: a range comparison on

        a checkbox is rejected rather than silently matching nothing. The valueless

        operators (``is_empty``, ``is_not_empty``, ``is_true``, ``is_false``) must

        not carry a value.'
      properties:
        column_id:
          anyOf:
          - format: uuid
            type: string
          - $ref: '#/components/schemas/TableRowFilterScope'
          description: A column ID, or `__any_column__` to ask about every cell in the row at once. `__any_column__` takes only `has_error` and `has_no_error`.
          title: Column Id
        operator:
          $ref: '#/components/schemas/TableFilterOperator'
        type:
          const: condition
          default: condition
          title: Type
          type: string
        value:
          anyOf:
          - $ref: '#/components/schemas/CellValue-Input'
          - type: 'null'
          description: The operand; omitted for the valueless operators.
      required:
      - column_id
      - operator
      title: TableRowFilterSchema
      type: object
    NotFoundResponse:
      properties:
        detail:
          description: The detail of why the resource was not found.
          title: Detail
          type: string
      required:
      - detail
      title: NotFoundResponse
      type: object
    TableFilterOperator:
      description: 'A row filter predicate.


        Which operators are legal depends on the column''s data type; the service

        validates the pairing and rejects a mismatch, so an operator here is a

        vocabulary entry rather than a promise it applies everywhere.


        Two families live here. The VALUE operators ask about what a cell holds and

        are keyed off the column''s storage slot. The STATE operators ask about what

        the last run DID to the cell (errored, skipped, never ran, went stale) and

        are keyed off the column''s kind instead: they read the compute metadata that

        only a computed column ever writes, and mean nothing on a hand-typed one.'
      enum:
      - eq
      - neq
      - gt
      - gte
      - lt
      - lte
      - contains
      - not_contains
      - contains_any_of
      - not_contains_any_of
      - starts_with
      - is_true
      - is_false
      - is_empty
      - is_not_empty
      - has_error
      - has_no_error
      - has_results
      - has_no_results
      - has_not_run
      - is_stale
      - is_not_stale
      - run_condition_not_met
      - run_stopped
      title: TableFilterOperator
      type: string
    TableRowSortSchema:
      description: The column a rows query is ordered by, and which way.
      properties:
        column_id:
          anyOf:
          - format: uuid
            type: string
          - $ref: '#/components/schemas/TableRowSystemSortKey'
          description: A column ID, or `__created_at__` / `__updated_at__` to order by when the row was added or last edited.
          title: Column Id
        direction:
          $ref: '#/components/schemas/TableSortDirection'
          default: asc
          description: Ascending or descending.
      required:
      - column_id
      title: TableRowSortSchema
      type: object
    ServerErrorResponse:
      properties:
        detail:
          description: The detail of why the server returned an error.
          title: Detail
          type: string
      required:
      - detail
      title: ServerErrorResponse
      type: object
    TableExportFormat:
      description: 'The file a table export is downloaded as.


        The two differ in more than their extension. A CSV is text, so every value

        becomes a string and free text is defanged against a spreadsheet reading a

        leading "=" as a formula. A workbook keeps native types, so a number stays

        summable and a date sorts as a date, and no defanging is needed because a

        string cell is never evaluated.'
      enum:
      - csv
      - xlsx
      title: TableExportFormat
      type: string
    CellValue-Input:
      anyOf:
      - type: string
      - type: integer
      - type: number
      - type: boolean
      - format: date-time
        type: string
      - format: date
        type: string
      - items:
          anyOf:
          - $ref: '#/components/schemas/CellValue-Input'
          - type: 'null'
        type: array
      - additionalProperties:
          anyOf:
          - $ref: '#/components/schemas/CellValue-Input'
          - type: 'null'
        type: object
    TableFilterJoiner:
      description: How the members of one filter level combine.
      enum:
      - and
      - or
      title: TableFilterJoiner
      type: string
    ForbiddenResponse:
      properties:
        detail:
          description: The detail of why the request is forbidden.
          title: Detail
          type: string
      required:
      - detail
      title: ForbiddenResponse
      type: object
    TableRowFilterGroupSchema-Input:
      description: 'A parenthesised run of conditions, joined among themselves.


        Holds conditions and never groups: one level of nesting is expressible and a

        second is not, structurally. That covers ``A and (B or C)`` (what a filter

        panel offers) while keeping the SQL a flat walk.'
      properties:
        conditions:
          description: The conditions inside the parentheses.
          items:
            $ref: '#/components/schemas/TableRowFilterSchema-Input'
          maxItems: 8
          minItems: 1
          title: Conditions
          type: array
        joiner:
          $ref: '#/components/schemas/TableFilterJoiner'
          default: and
          description: How this group's conditions combine.
        type:
          const: group
          default: group
          title: Type
          type: string
      required:
      - conditions
      title: TableRowFilterGroupSchema
      type: object
    TableRowSystemSortKey:
      description: 'The sort keys that order by the ROW rather than by one column''s cells.


        ``CREATED_AT`` is when the row was added; ``UPDATED_AT`` is when any of its

        cells last changed (the row was added, for one with no cells). They share

        the sort slot with column IDs, so a query or a saved view names either the

        same way; the dunder spelling keeps them apart from any UUID.'
      enum:
      - __created_at__
      - __updated_at__
      title: TableRowSystemSortKey
      type: string
    TableExportRequestSchema:
      description: 'Request body for a table file export.


        Two scopes, one body. Send ``sorts``/``where`` to export what the grid is

        currently showing, in the same vocabulary the rows query accepts, so a

        filtered view exports exactly the rows the user can see. Send ``record_ids``

        to export a specific selection instead. The two are mutually exclusive: an

        enumerated selection has already answered the question a filter asks.


        ``column_ids`` is the projection, in display order, so hiding or reordering

        a column in the grid is reflected in the file.


        ``format`` picks the file. It defaults to CSV, so a client written before

        Excel existed keeps working untouched.'
      properties:
        column_ids:
          anyOf:
          - items:
              format: uuid
              type: string
            maxItems: 500
            type: array
          - type: 'null'
          description: Export these columns, in this order. Omit for every column, in the table's own column order.
          title: Column Ids
        except_record_ids:
          anyOf:
          - items:
              format: uuid
              type: string
            maxItems: 1000
            minItems: 1
            type: array
          - type: 'null'
          description: 'Leave these rows out of a selection of every matching row: the rows unticked after Select all. At most 1000.'
          title: Except Record Ids
        format:
          $ref: '#/components/schemas/TableExportFormat'
          default: csv
          description: The file to download. `csv` writes every value as text. `xlsx` keeps native types, so numbers stay summable and dates sort as dates.
        record_ids:
          anyOf:
          - items:
              format: uuid
              type: string
            maxItems: 10000
            type: array
          - type: 'null'
          description: Export exactly these rows, in display order. Mutually exclusive with `sorts`, `where` and `except_record_ids`.
          title: Record Ids
        sorts:
          description: Order rows by these columns instead of the display order.
          items:
            $ref: '#/components/schemas/TableRowSortSchema'
          maxItems: 3
          title: Sorts
          type: array
        where:
          anyOf:
          - $ref: '#/components/schemas/TableRowsWhereSchema-Input'
          - type: 'null'
          description: Export only rows satisfying this predicate tree.
      title: TableExportRequestSchema
      type: object
    TableRowWhereItemSchema-Input:
      oneOf:
      - $ref: '#/components/schemas/TableRowFilterSchema-Input'
      - $ref: '#/components/schemas/TableRowFilterGroupSchema-Input'
    TableSortDirection:
      description: Which way a sorted row listing runs.
      enum:
      - asc
      - desc
      title: TableSortDirection
      type: string
    UnauthorizedResponse:
      properties:
        detail:
          description: The detail of why the request is unauthorized.
          title: Detail
          type: string
      required:
      - detail
      title: UnauthorizedResponse
      type: object
    TableRowFilterScope:
      description: 'The filter targets that name the whole ROW rather than one column.


        ``ANY_COLUMN`` asks a question of every cell in the row at once: "does any

        column have an error?" is the table-wide half of the per-column ``has_error``.

        It stands in the ``column_id`` slot of an ordinary condition (the same trick

        the system sort keys use), so a row-wide question travels through every

        surface that already carries a predicate tree (a saved view, a run''s scope,

        an export, a count) with nothing to add to any of them. The dunder spelling

        keeps it apart from any UUID.'
      enum:
      - __any_column__
      - __record_id__
      title: TableRowFilterScope
      type: string
    TableRowsWhereSchema-Input:
      description: 'The whole predicate for a rows query.


        ``items`` mixes conditions with groups under one joiner, so ``A and (B or C)``

        is an AND over ``[A, group(OR, [B, C])]``. Send no ``where`` at all rather

        than an empty one, so "no filter" stays a single state.


        The cap is on LEAVES, not on items: eight conditions cost eight correlated

        EXISTS clauses whether they are grouped or not, and it is the clause count

        that the query planner pays for.'
      properties:
        items:
          description: Conditions and groups. May be empty when unique_by or within is set.
          items:
            $ref: '#/components/schemas/TableRowWhereItemSchema-Input'
          maxItems: 8
          title: Items
          type: array
        joiner:
          $ref: '#/components/schemas/TableFilterJoiner'
          default: and
          description: How the top-level items combine.
        unique_by:
          anyOf:
          - format: uuid
            type: string
          - type: 'null'
          description: 'Keep one row per value of this column: of the rows the conditions match, the first in the table''s own order for each value. Rows with the column blank always stay. Not a list or object column.'
          title: Unique By
        within:
          anyOf:
          - $ref: '#/components/schemas/TableRowsWhereSchema-Input'
          - type: 'null'
          description: 'A second filter rows must also match, applied on its own: its unique_by picks from its own conditions only. How to narrow a saved view''s rows without changing which row it keeps per value. One level deep.'
      title: TableRowsWhereSchema
      type: object
  securitySchemes:
    APIKeyHeader:
      in: header
      name: X-API-Key
      type: apiKey
    HTTPBearer:
      scheme: bearer
      type: http