curl --request GET \
--url https://api.roofkit.ai/api/v1/objects/{object_id}/records \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.roofkit.ai/api/v1/objects/{object_id}/records"
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}/records', 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}/records",
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}/records"
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}/records")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roofkit.ai/api/v1/objects/{object_id}/records")
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{
"records": [
{
"id": "<string>",
"object_id": "<string>",
"display_label": "<string>",
"values": {},
"relationships": [
{
"id": "<string>",
"relationship_definition_id": "<string>",
"field_id": "<string>",
"source_object_id": "<string>",
"source_record_id": "<string>",
"target_object_id": "<string>",
"target_object_slug": "<string>",
"target_record_id": "<string>",
"target_label": "<string>",
"target_attribution": {
"source": "<string>",
"medium": "<string>",
"campaign": "<string>",
"content": "<string>",
"conversion_url": "<string>",
"entry": "button"
}
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"record_key": "<string>",
"stage_history": [
{
"field_id": "<string>",
"field_key": "<string>",
"option_id": "<string>",
"option_label": "<string>",
"entered_at": "2023-11-07T05:31:56Z"
}
],
"stage_dates": {
"appointment_at": "2023-11-07T05:31:56Z",
"won_at": "2023-11-07T05:31:56Z",
"lost_at": "2023-11-07T05:31:56Z"
}
}
],
"pagination": {
"limit": 5000,
"next_cursor": "<string>",
"has_more": true,
"is_capped": 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": {}
}
}List object records
Lists records for one object. Pagination uses limit, next_cursor, and has_more. Request again with next_cursor until has_more is false. A custom object read without search, in created_at or updated_at order, follows a keyset cursor and returns every record exactly once. The default order is created_at, newest first. One page of that read reads at most 1,000 records, so a page with filters can hold fewer records than limit, or none, while has_more is true. Do not use the page size to decide that the list is finished. A read with search, with a sort on another field, or on a built-in object such as Contacts pages by number, and is_capped is true when the engine window stops at 1,000 rows. Contacts list only finalized leads. A cursor works only with the order that issued it. A malformed or mismatched cursor returns 400.
curl --request GET \
--url https://api.roofkit.ai/api/v1/objects/{object_id}/records \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.roofkit.ai/api/v1/objects/{object_id}/records"
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}/records', 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}/records",
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}/records"
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}/records")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roofkit.ai/api/v1/objects/{object_id}/records")
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{
"records": [
{
"id": "<string>",
"object_id": "<string>",
"display_label": "<string>",
"values": {},
"relationships": [
{
"id": "<string>",
"relationship_definition_id": "<string>",
"field_id": "<string>",
"source_object_id": "<string>",
"source_record_id": "<string>",
"target_object_id": "<string>",
"target_object_slug": "<string>",
"target_record_id": "<string>",
"target_label": "<string>",
"target_attribution": {
"source": "<string>",
"medium": "<string>",
"campaign": "<string>",
"content": "<string>",
"conversion_url": "<string>",
"entry": "button"
}
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"record_key": "<string>",
"stage_history": [
{
"field_id": "<string>",
"field_key": "<string>",
"option_id": "<string>",
"option_label": "<string>",
"entered_at": "2023-11-07T05:31:56Z"
}
],
"stage_dates": {
"appointment_at": "2023-11-07T05:31:56Z",
"won_at": "2023-11-07T05:31:56Z",
"lost_at": "2023-11-07T05:31:56Z"
}
}
],
"pagination": {
"limit": 5000,
"next_cursor": "<string>",
"has_more": true,
"is_capped": 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.readAuthorizations
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.
5001 <= x <= 100200JSON 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"}]
20000