Read and write records with the REST API
Every table in your app has REST endpoints for listing, reading, creating, updating and deleting its records. This article shows each request. You need an API key with the Records scopes. See Create an API key.
All paths are under https://unstack.us/api/v1. Replace customers with your table's slug. To see your tables and their slugs, call GET /custom.
List records
```bash
curl "https://unstack.us/api/v1/custom/customers?limit=10" \
-H "X-API-Key: usk_your_api_key"
```
```json
{
"data": [
{
"name": "Blue Wave Pools",
"email": "office@example.com",
"status": "active",
"id": "0b6f1c0e-...",
"created_at": "2026-10-13T08:30:00.000Z",
"updated_at": "2026-10-13T08:30:00.000Z",
"row_number": 48
}
],
"pagination": { "total": 47, "limit": 10, "offset": 0 }
}
```
A record is a flat object: your fields, plus id, created_at, updated_at and row_number.
Filter, sort and page
limit: how many records to return. The default is 50 and the maximum is 100.offset: how many records to skip.sort: the field to sort by. The default iscreated_at.order: addorder=descfor descending order. The default is ascending.- Any other query parameter is an exact-match filter on that field.
```bash
curl "https://unstack.us/api/v1/custom/customers?status=active&sort=created_at&order=desc&limit=50&offset=100" \
-H "X-API-Key: usk_your_api_key"
```
To read a whole table, keep increasing offset by limit until you have fetched total records.
Get one record
```bash
curl "https://unstack.us/api/v1/custom/customers/RECORD_ID" \
-H "X-API-Key: usk_your_api_key"
```
The response is { "data": { ... } }. An id that does not exist returns 404.
Create a record
Send the fields as a JSON object. The response has status 201 and the new record.
```bash
curl -X POST "https://unstack.us/api/v1/custom/customers" \
-H "X-API-Key: usk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Blue Wave Pools", "email": "office@example.com", "status": "active"}'
```
Update a record
PATCH changes only the fields you send. The other fields keep their values.
```bash
curl -X PATCH "https://unstack.us/api/v1/custom/customers/RECORD_ID" \
-H "X-API-Key: usk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"status": "inactive"}'
```
You cannot change id or created_at. They are ignored if you send them.
Delete a record
```bash
curl -X DELETE "https://unstack.us/api/v1/custom/customers/RECORD_ID" \
-H "X-API-Key: usk_your_api_key"
```
A successful delete returns status 204 with no body.
Things to know
- Listing and reading need the Records (Read) scope. Creating, updating and deleting need Records (Write).
- A relation field holds the
idof the record it points to. - Records created or changed through the API fire your automations' record triggers, and they send outgoing webhook events if you have subscriptions. See Send webhooks when records change.
- Your plan's record limit applies to records created through the API too.
For limits and error codes, see API rate limits and errors.