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.

Next steps

Buy me a coffee