Skip to main content
PUT
/
api
/
lists
/
{id}
/
cells
Upsert a cell value
curl --request PUT \
  --url https://app.puffle.ai/api/lists/{id}/cells \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "rowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "columnId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "value": "<unknown>"
}
'
{ "cell": { "id": "e1111111-1111-1111-1111-111111111111", "list_id": "a1111111-1111-1111-1111-111111111111", "column_id": "c1111111-1111-1111-1111-111111111111", "row_id": "r1111111-1111-1111-1111-111111111111", "value": "Jane Doe", "status": "completed", "reasoning": null, "error": null, "created_at": "2026-04-22T10:00:00Z", "updated_at": "2026-04-22T10:05:00Z" } }

Overview

Upsert a single cell at the intersection of rowId and columnId. The server:
  1. Verifies the list, row, and column all belong to the caller
  2. Upserts the cell (match on column_id + row_id)
  3. Sets status = completed, clears reasoning and error
This is the endpoint to call when a user manually edits a cell value — it flushes out any prior pending enrichment state and writes the human-provided value as the final answer.

AI agent notes

Clobbers enrichment. Because the endpoint sets status = completed and clears reasoning/error, any in-flight enrichment result for that cell gets overwritten when it lands. If you want to keep enrichment running, don’t upsert the cell manually — let the background task finish first.Value typing. The cell value column is typed unknown in the API response because columns can be text, number, boolean, URL, enum, multiselect, list, date, email, or phone. Always match the column’s schema.type (read via getList or listListColumns) — Mintlify will show the cell back verbatim, but downstream readers may reject a mistyped value.Ownership checks. Three 404s are possible, in order: list not found, row not found, column not found. The row and column must both belong to this list — cross-list references return 404 even if the caller owns the other list.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string<uuid>
required

List UUID.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$

Body

application/json

Upsert a single cell. On match (same columnId + rowId), the existing cell is updated; otherwise a new cell is inserted. Status is always set to completed, clearing any prior reasoning or error.

rowId
string<uuid>
required

Row UUID. Must belong to the list.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
columnId
string<uuid>
required

Column UUID. Must belong to the list.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
value
any
required

New cell value. Type should match the column's schema.type (text/number/boolean/URL/enum/multiselect/list/date/email/phone).

Response

Cell upserted.

cell
object
required

The upserted cell after the write.