curl --request GET \
--url https://api.roofkit.ai/api/v1/objects/{object_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.roofkit.ai/api/v1/objects/{object_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.roofkit.ai/api/v1/objects/{object_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.roofkit.ai/api/v1/objects/{object_id}/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.roofkit.ai/api/v1/objects/{object_id}/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.roofkit.ai/api/v1/objects/{object_id}/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roofkit.ai/api/v1/objects/{object_id}/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"filename": "<string>",
"csv": "<string>",
"record_count": 123,
"is_capped": true,
"next_cursor": "<string>",
"has_more": true,
"total": 1
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "API key does not include the required scope: leads.write.",
"request_id": "req_123",
"details": {
"required_scope": "leads.write",
"missing_scopes": [
"leads.write"
]
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}Export object records
Exports formula-safe CSV for the object. A custom object export without search, in created_at or updated_at order, holds at most 1,000 records per response. Request again with next_cursor until has_more is false. Each response is a complete CSV with its own header row. To export a date range, pass a created_at or updated_at filter in filters_json. Any other export reads the engine window of 1,000 rows, answers has_more false, and sets is_capped when more rows remain.
curl --request GET \
--url https://api.roofkit.ai/api/v1/objects/{object_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.roofkit.ai/api/v1/objects/{object_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.roofkit.ai/api/v1/objects/{object_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.roofkit.ai/api/v1/objects/{object_id}/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.roofkit.ai/api/v1/objects/{object_id}/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.roofkit.ai/api/v1/objects/{object_id}/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roofkit.ai/api/v1/objects/{object_id}/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"filename": "<string>",
"csv": "<string>",
"record_count": 123,
"is_capped": true,
"next_cursor": "<string>",
"has_more": true,
"total": 1
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "API key does not include the required scope: leads.write.",
"request_id": "req_123",
"details": {
"required_scope": "leads.write",
"missing_scopes": [
"leads.write"
]
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"request_id": "<string>",
"details": {}
}
}data_objects.exportAuthorizations
Use Authorization: Bearer rk_live_....
Path Parameters
Object id, system key such as system:leads, or slug from discovery.
1 - 200Query Parameters
200Opaque cursor returned by list/export responses. Send it back unchanged; malformed cursors return 400.
500200JSON text of an ObjectFilterQuery. Send an array of filters that must all match, or an object with filters and an advanced filter whose rules join with and or or. Each filter names a field in fieldId by its id or its key, as GET /api/v1/objects/{object_id} lists them. Operators: is_empty and is_not_empty take no value. equals, not_equals, contains, and has_reached take value. any_of takes an array of strings. greater_than and less_than take a number, and between takes value and valueTo. before and after take a date (YYYY-MM-DD) or an ISO 8601 datetime and exclude the day they name. within_range takes value and valueTo and includes both days. A bare date covers the whole UTC day. A datetime with an offset is converted to UTC. Without filters_json the read applies the filters of view_id, or none. Invalid JSON, an unknown operator, a missing value, an unknown field, or a field that cannot be filtered returns 400 with the path of each issue. Example, records created in October 2026: [{"fieldId":"created_at","operator":"within_range","value":"2026-10-01","valueTo":"2026-10-31"}]
20000JSON text of an array of ObjectSort. Each sort names a field in fieldId by its id or its key. Without sorts_json the read uses the sort of view_id, or created_at, newest first. Only one sort on created_at or updated_at keeps the keyset cursor. Any other sort pages by number. Invalid JSON, an unknown field, or a formula field returns 400. Example, oldest records first: [{"fieldId":"created_at","direction":"asc"}]
20000Response
CSV export payload.
Cursor for the next export response, or null on the last one.
True while more records follow. Request again with next_cursor.
Exact number of records that match the export. Some exports include it and others do not, so treat it as optional.
x >= 0