API

Tables

The tables API provides project-scoped structured storage for loops, agents, and application code.

Create and inspect a table

POST /v1/projects/{project}/tables
GET /v1/projects/{project}/tables
GET /v1/projects/{project}/tables/{table_id}
PATCH /v1/projects/{project}/tables/{table_id}

A table declares a name, optional description and instructions, a column schema, and one required string identity column. Add optional columns later as the data changes. The identity column cannot change after creation because it is the stable key used for upserts.

Write rows

Create, update, upsert, or delete rows with:

POST /v1/projects/{project}/tables/{table_id}/rows
PATCH /v1/projects/{project}/tables/{table_id}/rows/{row_id}
POST /v1/projects/{project}/tables/{table_id}/upsert
DELETE /v1/projects/{project}/tables/{table_id}/rows/{row_id}

Rows carry a version for optimistic concurrency. Send the current version on an update. A stale version returns 409 Conflict instead of overwriting a newer write.

Use the bulk endpoint when importing several rows in one request:

POST /v1/projects/{project}/tables/{table_id}/bulk

Structured queries support equality plus $eq, $ne, $gt, $gte, $lt, $lte, $in, and $exists operators:

POST /v1/projects/{project}/tables/{table_id}/query

Search uses the same modes as the built-in agent table actions:

POST /v1/projects/{project}/tables/{table_id}/search
ModeUse when
keywordYou need predictable token-prefix matches. This is the default.
semanticThe idea may match even when the exact words do not.
hybridYou want keyword precision with semantic recall.

Semantic and hybrid search require an embedding backend on the deployment.

Events

Row changes emit table.row.inserted, table.row.updated, and table.row.deleted. These events can start loops or resume a wait_for_event step.

Next