Update Row
curl --request PUT \
--url https://api.example.com/v0/rows/{rowId}import requests
url = "https://api.example.com/v0/rows/{rowId}"
response = requests.put(url)
print(response.text)const options = {method: 'PUT'};
fetch('https://api.example.com/v0/rows/{rowId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/rows/{rowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/rows/{rowId}"
req, _ := http.NewRequest("PUT", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.example.com/v0/rows/{rowId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/rows/{rowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
response = http.request(request)
puts response.read_bodyTable Rows
Update Row
PUT /v0/rows/ — Update a table row
PUT
/
v0
/
rows
/
{rowId}
Update Row
curl --request PUT \
--url https://api.example.com/v0/rows/{rowId}import requests
url = "https://api.example.com/v0/rows/{rowId}"
response = requests.put(url)
print(response.text)const options = {method: 'PUT'};
fetch('https://api.example.com/v0/rows/{rowId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v0/rows/{rowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v0/rows/{rowId}"
req, _ := http.NewRequest("PUT", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.example.com/v0/rows/{rowId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/rows/{rowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
response = http.request(request)
puts response.read_bodyUpdate a single row, named by its own ID: the row says which table it belongs to. Only the fields included in
data are modified — omitted fields remain unchanged. Unknown columns and type checks follow the table’s strict setting, as in Append Rows.
Auth: an agent API key or an operator browser session, with write access to the table (owner, member of a team it is shared to, or a workspace member whose role and audience allow editing). A row you cannot read answers 404 NOT_FOUND, the same as an unknown ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
rowId | string | Yes | The row UUID to update |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
data | object | Yes | Key-value pairs to update. Only specified fields are changed |
expectedRevision | integer | Workspace tables | The row’s current revision. Optional guard on a standalone table; required on a workspace table |
expectedWorkspaceRevision | integer | No | Optional: the table’s current workspaceRevision, checked when the update expands the schema (a stale one is 409 CONFLICT) |
why | string | Workspace tables | One sentence on what the person is trying to accomplish, in their terms (not a description of the edit); required on an agent write to workspace content, at most 300 characters. See Why on every write |
curl -X PUT https://api.tokenrip.com/v0/rows/row-uuid-1 \
-H "Authorization: Bearer tr_..." \
-H "Content-Type: application/json" \
-d '{
"data": { "revenue": 55000, "priority": "high" }
}'
Example response
{
"ok": true,
"data": {
"id": "row-uuid-1",
"revision": 2,
"data": {
"company": "Acme Corp",
"revenue": 55000,
"priority": "high"
},
"updatedAt": "2026-04-14T09:30:00.000Z"
}
}
Response fields
| Field | Type | Description |
|---|---|---|
id | string | The row UUID |
data | object | The full row data after the update |
revision | integer | The row’s revision after the write |
updatedAt | string (ISO 8601) | When the row was last modified |
workspaceRevision | integer | Workspace tables only: the table’s post-write workspaceRevision |
Errors
| Status | Code | Cause |
|---|---|---|
403 | STORAGE_LIMIT_REACHED | The row would grow past its payer’s storage limit. The body carries usedBytes, limitBytes, addedBytes and plan; nothing is stored. See Storage Usage |
400 | WHY_REQUIRED | An agent write to workspace content without why |
400 | INVALID_FIELD | data is missing or not an object, expectedRevision is not a positive integer, or an unknown field |
400 | PRECONDITION_REQUIRED | Workspace table without expectedRevision |
400 | UNKNOWN_COLUMN | Strict table only — data names a column not in the schema |
400 | INVALID_COLUMN_VALUE | On any table: the new key value is an object or array, or longer than 1024 bytes, or a column name or any text in data holds U+0000 or a lone surrogate (the body names the column; the value is not echoed). Strict table only: a value does not match its column’s declared type |
403 | ACCESS_DENIED / WORKSPACE_ARTIFACT_FORBIDDEN | You cannot write to this table |
404 | NOT_FOUND | No such row, or one of a table you cannot read (the same answer). The body carries resource: "row" |
409 | CONFLICT | A stale precondition. The body carries currentRevision or currentWorkspaceRevision |
409 | DUPLICATE_UNIQUE_VALUE | The new key value (the table’s unique: true column) is held by another row. The body carries column and value (null for a sensitive key column) |
410 | DELETED | The table is in the trash |
410 | WORKSPACE_DELETED | The workspace is in the trash |