API
Write records
Create a record, update some of its fields, and delete it.
Writing needs the write_records capability in the workspace and the collection’s create, update or delete access. The examples reuse base from Read records.
Create a record
POST /api/v1/workspaces/:workspace/collections/:collection/records
Send field values as a JSON object. Required fields must be present.
curl -X POST 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/collections/YOUR_COLLECTION_ID/records' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"title":"Cafe loyalty app","stage":"Lead","amount":4500000}' const res = await fetch(`${base}/records`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'Cafe loyalty app', stage: 'Lead', amount: 4500000 })
});
const { data: created } = await res.json(); body := strings.NewReader(`{"title":"Cafe loyalty app","stage":"Lead","amount":4500000}`)
req, _ := http.NewRequest("POST", base+"/records", body)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req) res = requests.post(
f"{base}/records",
headers={"Authorization": f"Bearer {token}"},
json={"title": "Cafe loyalty app", "stage": "Lead", "amount": 4500000},
)
created = res.json()["data"] The response is the new record, with its id, created_at and updated_at:
{
"data": {
"id": "a462692b32bea7f8c1a523c20eea51cf",
"title": "Cafe loyalty app",
"stage": "Lead",
"amount": 4500000,
"created_at": "2026-10-23T13:00:32.221427Z",
"updated_at": "2026-10-23T13:00:32.221427Z"
},
"meta": { "request_id": "...", "response_time": 2.9 }
} Update a record
PATCH /api/v1/workspaces/:workspace/collections/:collection/records/:record
Send only the fields that change. Add If-Match with the ETag you read to reject the update if the record changed in the meantime.
curl -X PATCH 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/collections/YOUR_COLLECTION_ID/records/YOUR_RECORD_ID' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-H 'If-Match: "2026-10-23T13:00:32.221427Z"' \
--data '{"stage":"Qualified"}' const res = await fetch(`${base}/records/${recordId}`, {
method: 'PATCH',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'If-Match': etag
},
body: JSON.stringify({ stage: 'Qualified' })
});
const { data: updated } = await res.json(); req, _ := http.NewRequest("PATCH", base+"/records/"+recordID, strings.NewReader(`{"stage":"Qualified"}`))
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("If-Match", etag)
res, err := http.DefaultClient.Do(req) res = requests.patch(
f"{base}/records/{record_id}",
headers={"Authorization": f"Bearer {token}", "If-Match": etag},
json={"stage": "Qualified"},
)
updated = res.json()["data"] The response is the full record with a new updated_at. If the record changed after you read it, you get 412 record_changed: read it again and retry.
Delete a record
DELETE /api/v1/workspaces/:workspace/collections/:collection/records/:record
curl -X DELETE 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/collections/YOUR_COLLECTION_ID/records/YOUR_RECORD_ID' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' const res = await fetch(`${base}/records/${recordId}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` }
});
console.log(res.status); // 204 req, _ := http.NewRequest("DELETE", base+"/records/"+recordID, nil)
req.Header.Set("Authorization", "Bearer "+token)
res, err := http.DefaultClient.Do(req) res = requests.delete(f"{base}/records/{record_id}", headers={"Authorization": f"Bearer {token}"})
print(res.status_code) # 204 A successful delete returns 204 with no body. Deleting is permanent.