Oneprofile Table Export API
Endpoint for downloading a table's rows as CSV.
Endpoint for downloading a table's rows as CSV.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/getoneprofile-ai:getoneprofile-ai-table-export-api"
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.
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: 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