curl --request POST \
--url https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sort": [
{
"field": "name",
"direction": "asc"
},
{
"field": "createdAt",
"direction": "desc"
}
],
"filter": {
"and": [
{
"field": "Status",
"equals": "Active"
},
{
"field": "Amount",
"greater_than": 100
}
]
},
"limit": 100,
"offset": 0
}
'import requests
url = "https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list"
payload = {
"sort": [
{
"field": "name",
"direction": "asc"
},
{
"field": "createdAt",
"direction": "desc"
}
],
"filter": { "and": [
{
"field": "Status",
"equals": "Active"
},
{
"field": "Amount",
"greater_than": 100
}
] },
"limit": 100,
"offset": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sort: [{field: 'name', direction: 'asc'}, {field: 'createdAt', direction: 'desc'}],
filter: {
and: [{field: 'Status', equals: 'Active'}, {field: 'Amount', greater_than: 100}]
},
limit: 100,
offset: 0
})
};
fetch('https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list', 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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list",
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([
'sort' => [
[
'field' => 'name',
'direction' => 'asc'
],
[
'field' => 'createdAt',
'direction' => 'desc'
]
],
'filter' => [
'and' => [
[
'field' => 'Status',
'equals' => 'Active'
],
[
'field' => 'Amount',
'greater_than' => 100
]
]
],
'limit' => 100,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list"
payload := strings.NewReader("{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"records": [
{
"id": "d4b3c2a3-c46b-46a1-a8ec-81b664bb41cb",
"data": {
"f6JE46z2WoX": "",
"f5gMv8mk8CX": "",
"foEBBtqDY1F": false
},
"fields": {
"Name": "",
"Notes": "",
"Active": false
},
"createdAt": "2025-11-13T11:59:45.000Z",
"updatedAt": "2025-11-13T11:59:45.000Z"
}
],
"total": 1250,
"hasMore": true
}List Records
Retrieves records from a table with filtering, sorting, and pagination using either table ID or table name.
curl --request POST \
--url https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sort": [
{
"field": "name",
"direction": "asc"
},
{
"field": "createdAt",
"direction": "desc"
}
],
"filter": {
"and": [
{
"field": "Status",
"equals": "Active"
},
{
"field": "Amount",
"greater_than": 100
}
]
},
"limit": 100,
"offset": 0
}
'import requests
url = "https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list"
payload = {
"sort": [
{
"field": "name",
"direction": "asc"
},
{
"field": "createdAt",
"direction": "desc"
}
],
"filter": { "and": [
{
"field": "Status",
"equals": "Active"
},
{
"field": "Amount",
"greater_than": 100
}
] },
"limit": 100,
"offset": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sort: [{field: 'name', direction: 'asc'}, {field: 'createdAt', direction: 'desc'}],
filter: {
and: [{field: 'Status', equals: 'Active'}, {field: 'Amount', greater_than: 100}]
},
limit: 100,
offset: 0
})
};
fetch('https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list', 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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list",
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([
'sort' => [
[
'field' => 'name',
'direction' => 'asc'
],
[
'field' => 'createdAt',
'direction' => 'desc'
]
],
'filter' => [
'and' => [
[
'field' => 'Status',
'equals' => 'Active'
],
[
'field' => 'Amount',
'greater_than' => 100
]
]
],
'limit' => 100,
'offset' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list"
payload := strings.NewReader("{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tables.zite.com/api/v1/bases/{databaseId}/tables/{tableId}/records/list")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sort\": [\n {\n \"field\": \"name\",\n \"direction\": \"asc\"\n },\n {\n \"field\": \"createdAt\",\n \"direction\": \"desc\"\n }\n ],\n \"filter\": {\n \"and\": [\n {\n \"field\": \"Status\",\n \"equals\": \"Active\"\n },\n {\n \"field\": \"Amount\",\n \"greater_than\": 100\n }\n ]\n },\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"records": [
{
"id": "d4b3c2a3-c46b-46a1-a8ec-81b664bb41cb",
"data": {
"f6JE46z2WoX": "",
"f5gMv8mk8CX": "",
"foEBBtqDY1F": false
},
"fields": {
"Name": "",
"Notes": "",
"Active": false
},
"createdAt": "2025-11-13T11:59:45.000Z",
"updatedAt": "2025-11-13T11:59:45.000Z"
}
],
"total": 1250,
"hasMore": true
}Pagination
| Parameter | Type | Default | Max |
|---|---|---|---|
limit | number | 500 | 2000 |
offset | number | 0 | - |
hasMore to determine if additional pages exist. Increment offset by limit for each subsequent request.
Sorting
When nosort parameter is provided, records are returned in ascending order by creation time (createdAt ASC).
{
"sort": [
{ "field": "name", "direction": "asc" },
{ "field": "createdAt", "direction": "desc" }
]
}
| Property | Type | Required | Description |
|---|---|---|---|
field | string | Yes | Field name, field ID, or system field (id, createdAt, updatedAt) |
direction | string | No | "asc" (default) or "desc" |
fieldId is also accepted for backward compatibility, but field is preferred.Filtering
Use thefilter parameter to query records. Filters support nested AND/OR logic for complex queries.
{
"filter": {
"field": "Status",
"equals": "Active"
}
}
Combining Filters with AND/OR
Combining Filters with AND/OR
and or or to combine multiple conditions:{
"filter": {
"and": [
{ "field": "Status", "equals": "Active" },
{ "field": "Amount", "greater_than": 100 }
]
}
}
{
"filter": {
"or": [
{ "field": "Status", "equals": "Urgent" },
{ "field": "Priority", "equals": "High" }
]
}
}
{
"filter": {
"or": [
{ "field": "Status", "equals": "Urgent" },
{
"and": [
{ "field": "Priority", "equals": "High" },
{ "field": "Completed", "equals": false }
]
}
]
}
}
Available Operators
Available Operators
| Operator | Description | Example Value |
|---|---|---|
equals | Exact match | "Active" |
does_not_equal | Not equal to | "Archived" |
contains | Contains substring (text) or has value (multi-select) | "john" |
does_not_contain | Does not contain | "test" |
starts_with | Starts with string | "Mr." |
ends_with | Ends with string | "@gmail.com" |
is_empty | Field has no value | true |
is_not_empty | Field has a value | true |
in | Value is in array | ["Active", "Pending"] |
not_in | Value is not in array | ["Archived", "Deleted"] |
greater_than | Greater than (numbers/dates) | 100 or "2024-01-01" |
greater_than_or_equal_to | Greater than or equal | 100 |
less_than | Less than | 50 |
less_than_or_equal_to | Less than or equal | 50 |
Operators by Field Type
Operators by Field Type
| Field Type | Supported Operators |
|---|---|
Text (single_line_text, long_text, email, url, phone_number) | equals, does_not_equal, contains, does_not_contain, starts_with, ends_with, is_empty, is_not_empty, in, not_in |
Number (number, currency, percent, rating, duration) | equals, does_not_equal, greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to, is_empty, is_not_empty, in, not_in |
Date (date, datetime) | equals, does_not_equal, greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to, is_empty, is_not_empty |
Selection (single_select, multiple_select) | equals, does_not_equal, contains, does_not_contain, is_empty, is_not_empty, in, not_in |
| Checkbox | equals, does_not_equal |
Attachments (attachments) | is_empty, is_not_empty |
| Linked Record | contains, does_not_contain, is_empty, is_not_empty, in, not_in |
Filter Examples
Filter Examples
{ "filter": { "field": "Status", "equals": "Active" } }
{
"filter": {
"and": [
{ "field": "Price", "greater_than_or_equal_to": 10 },
{ "field": "Price", "less_than": 100 }
]
}
}
{ "filter": { "field": "CreatedAt", "greater_than": "2024-01-01" } }
{ "filter": { "field": "Status", "in": ["Active", "Pending", "Review"] } }
{ "filter": { "field": "AssignedTo", "is_not_empty": true } }
Authorizations
Enter your Zite API key. Format: Bearer <api_key>
Path Parameters
The unique identifier of the database
The unique identifier of the table. You can also use the table name instead of the ID.
Body
Number of records to return (default: 500, max: 2000)
1 <= x <= 2000Integer-based offset - Number of records to skip for pagination
x >= 0Array of sort objects. When not provided, records are returned in ascending order by creation time (createdAt ASC). All queries include an internal tie-breaker to ensure deterministic ordering across paginated requests.
- Option 1
- Option 2
Show child attributes
Show child attributes
Filter condition to query records. Supports nested AND/OR logic. Each condition requires field (field ID or name) and one operator (equals, does_not_equal, contains, greater_than, in, etc.). See Filtering documentation for details.
{ "field": "Status", "equals": "Active" }
Was this page helpful?