GET /projects/{project}/records/{table}
curl --request GET \
--url https://api-zangtable.com/projects/{project}/records/{table} \
--header 'Authorization: <authorization>'import requests
url = "https://api-zangtable.com/projects/{project}/records/{table}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api-zangtable.com/projects/{project}/records/{table}', 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-zangtable.com/projects/{project}/records/{table}",
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: <authorization>"
],
]);
$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-zangtable.com/projects/{project}/records/{table}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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-zangtable.com/projects/{project}/records/{table}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-zangtable.com/projects/{project}/records/{table}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {},
"error": {},
"request_id": "<string>"
}Records
GET /projects/{project}/records/{table}
Lists rows in a table.
GET
https://api-zangtable.com
/
projects
/
{project}
/
records
/
{table}
GET /projects/{project}/records/{table}
curl --request GET \
--url https://api-zangtable.com/projects/{project}/records/{table} \
--header 'Authorization: <authorization>'import requests
url = "https://api-zangtable.com/projects/{project}/records/{table}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api-zangtable.com/projects/{project}/records/{table}', 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-zangtable.com/projects/{project}/records/{table}",
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: <authorization>"
],
]);
$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-zangtable.com/projects/{project}/records/{table}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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-zangtable.com/projects/{project}/records/{table}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-zangtable.com/projects/{project}/records/{table}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {},
"error": {},
"request_id": "<string>"
}Lists rows in a table.
Full request:
With
Cursor page data example:
Endpoint details
string
required
Bearer
pat_... (Project API Token). Keep this token on your backend/server.string
required
Project slug. This acts as the Project ID in API paths.
string
required
Table name inside the project.
boolean
required
true for a successful response and false for an error response.object | null
Endpoint-specific response data when
ok is true; null on errors.object | null
Error code and message when
ok is false; null on success.string
required
Request identifier you can use when troubleshooting a specific API call.
Authentication
Project API Token.Parameters
Path:table required. Query: filters optional JSON; sort optional column; order optional asc/desc; limit optional 1-500 default 100; offset optional default 0; include_count or count optional boolean. The default page_mode=offset keeps the existing response. page_mode=cursor starts stable keyset pagination; send the returned next_cursor as cursor on subsequent requests.
has_more checks one row beyond the page even when include_count is false. Request include_count=true only when an exact total is needed.
Cursor mode requires a single-column primary key and an index whose first column is the selected sort column. With no sort, it uses the primary key. Keep the table, filters, sort, and order unchanged while paging, and leave offset at zero. A cursor response has page_mode: "cursor" and next_cursor instead of offset; next_cursor is null on the last page. Rows inserted or edited during paging can change which rows fall after the cursor, so use an export when an exact fixed data set is required.
Request examples
Basic request:curl -X GET "$BASE_URL/projects/{project}/records/{table}" \
-H 'Authorization: Bearer pat_PROJECT_TOKEN'
curl -X GET "$BASE_URL/projects/{project}/records/{table}?filters=%5B%7B%22column%22%3A%22status%22%2C%22op%22%3A%22%3D%22%2C%22value%22%3A%22active%22%7D%5D&sort=id&order=desc&limit=50&offset=0&include_count=true" \
-H 'Authorization: Bearer pat_PROJECT_TOKEN' \
-H 'X-Operation-Key: edit-profile-email' \
-H 'X-Operation-Run-Id: oprun_client_20260602_001'
Response examples
Success:{
"ok": true,
"data": {
"table": "contacts",
"rows": [
{
"id": 1,
"email": "ada@example.com",
"status": "active"
}
],
"limit": 100,
"offset": 0,
"returned": 1,
"has_more": false
},
"error": null,
"request_id": "req_20260602T012345_123456Z_abc123def456",
"operation_key": "edit-profile-email",
"operation_run_id": "oprun_20260602T012300_000000Z_a1b2c3d4e5f6",
"operation_grouping_status": "accepted_provided_run",
"meta": {
"generated_at": "2026-06-02T01:23:45Z"
}
}
include_count:
{
"ok": true,
"data": {
"table": "contacts",
"rows": [
{
"id": 1,
"email": "ada@example.com",
"status": "active"
}
],
"limit": 50,
"offset": 0,
"returned": 1,
"has_more": false,
"total": 1
},
"error": null,
"request_id": "req_20260602T012345_123456Z_abc123def456",
"meta": {
"generated_at": "2026-06-02T01:23:45Z"
}
}
{
"table": "contacts",
"rows": [{"id": 1, "email": "ada@example.com"}],
"limit": 1,
"returned": 1,
"has_more": true,
"page_mode": "cursor",
"next_cursor": "BASE64URL_CURSOR_FROM_RESPONSE"
}