curl --request POST \
--url https://api.getoneprofile.ai/tables/{table_id}/export/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"format": "csv",
"record_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"sorts": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "asc"
}
],
"where": {
"items": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "condition",
"value": "<string>"
}
],
"joiner": "and"
}
}
'import requests
url = "https://api.getoneprofile.ai/tables/{table_id}/export/"
payload = {
"column_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"format": "csv",
"record_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"sorts": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "asc"
}
],
"where": {
"items": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "condition",
"value": "<string>"
}
],
"joiner": "and"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
column_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
format: 'csv',
record_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
sorts: [{column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', direction: 'asc'}],
where: {
items: [
{
column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'condition',
value: '<string>'
}
],
joiner: 'and'
}
})
};
fetch('https://api.getoneprofile.ai/tables/{table_id}/export/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getoneprofile.ai/tables/{table_id}/export/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'column_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'format' => 'csv',
'record_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'sorts' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'direction' => 'asc'
]
],
'where' => [
'items' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'type' => 'condition',
'value' => '<string>'
]
],
'joiner' => 'and'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/tables/{table_id}/export/"
payload := strings.NewReader("{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getoneprofile.ai/tables/{table_id}/export/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/tables/{table_id}/export/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}"
response = http.request(request)
puts response.read_body{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Export table rows as a CSV or Excel file
Download a table’s rows as a file. Two scopes: send sorts/where/column_ids to export what the grid is currently showing, 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.
curl --request POST \
--url https://api.getoneprofile.ai/tables/{table_id}/export/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"format": "csv",
"record_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"sorts": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "asc"
}
],
"where": {
"items": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "condition",
"value": "<string>"
}
],
"joiner": "and"
}
}
'import requests
url = "https://api.getoneprofile.ai/tables/{table_id}/export/"
payload = {
"column_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"format": "csv",
"record_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"sorts": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "asc"
}
],
"where": {
"items": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "condition",
"value": "<string>"
}
],
"joiner": "and"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
column_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
format: 'csv',
record_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
sorts: [{column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', direction: 'asc'}],
where: {
items: [
{
column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'condition',
value: '<string>'
}
],
joiner: 'and'
}
})
};
fetch('https://api.getoneprofile.ai/tables/{table_id}/export/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getoneprofile.ai/tables/{table_id}/export/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'column_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'format' => 'csv',
'record_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'sorts' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'direction' => 'asc'
]
],
'where' => [
'items' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'type' => 'condition',
'value' => '<string>'
]
],
'joiner' => 'and'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/tables/{table_id}/export/"
payload := strings.NewReader("{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getoneprofile.ai/tables/{table_id}/export/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/tables/{table_id}/export/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"column_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"format\": \"csv\",\n \"record_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sorts\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"direction\": \"asc\"\n }\n ],\n \"where\": {\n \"items\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"condition\",\n \"value\": \"<string>\"\n }\n ],\n \"joiner\": \"and\"\n }\n}"
response = http.request(request)
puts response.read_body{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Path Parameters
Body
Request body for a table file export.
Two scopes, one body. Send sorts/where to export what the grid is
currently showing — 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.
Export these columns, in this order. Omit for every column, in the table's own column order.
500The file to download. csv writes every value as text. xlsx keeps native types, so numbers stay summable and dates sort as dates.
csv, xlsx Export exactly these rows, in display order. Mutually exclusive with sorts and where.
1000Order rows by these columns instead of the display order.
3Show child attributes
Show child attributes
Export only rows satisfying this predicate tree.
Show child attributes
Show child attributes
Response
The table as a CSV or Excel file.
Was this page helpful?