curl --request POST \
--url https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"edits": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"value": "<string>"
}
],
"restore": false
}
'import requests
url = "https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/"
payload = {
"edits": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"value": "<string>"
}
],
"restore": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
edits: [
{
column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
record_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
value: '<string>'
}
],
restore: false
})
};
fetch('https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/', 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.getoneprofile.ai/tables/{table_id}/cells/bulk/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'edits' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'record_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'value' => '<string>'
]
],
'restore' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/"
payload := strings.NewReader("{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}"
response = http.request(request)
puts response.read_body{
"applied": 123,
"rows": [
{
"cells": {},
"created_at": "2023-11-07T05:31:56Z",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"skipped": 123,
"stale_column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"recomputed_column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Set many table cell values
Apply up to 1000 manual cell edits in ONE transaction, then recompute their downstream formula cells: inline when the scope is small (see recomputed_column_ids), otherwise via a SINGLE cell-edited run covering all of them. The endpoint that makes a grid paste one request instead of N. A null value clears that cell. All-or-nothing: every column and value is validated before anything is written, so a formula column or a type mismatch anywhere rejects the whole batch and writes nothing. Same-value edits are counted in skipped and write nothing. Read-your-writes: the response carries every named row’s post-write state and version.
A Select or Multi-select cell takes only the column’s own options (its type_options.choices): each value is matched to one ignoring case and spacing and stored as the option is spelled, and one that names no option refuses the whole batch with a 422 cell_value_not_a_choice naming the cell and the options. restore is for the grid’s undo and redo history ONLY: it writes back a value the options no longer name exactly as the cell held it. Never set it to get a new value past the options; add the value to the column’s options instead.
curl --request POST \
--url https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"edits": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"value": "<string>"
}
],
"restore": false
}
'import requests
url = "https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/"
payload = {
"edits": [
{
"column_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"value": "<string>"
}
],
"restore": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
edits: [
{
column_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
record_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
value: '<string>'
}
],
restore: false
})
};
fetch('https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/', 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.getoneprofile.ai/tables/{table_id}/cells/bulk/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'edits' => [
[
'column_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'record_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'value' => '<string>'
]
],
'restore' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/"
payload := strings.NewReader("{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/tables/{table_id}/cells/bulk/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"edits\": [\n {\n \"column_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"record_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"value\": \"<string>\"\n }\n ],\n \"restore\": false\n}"
response = http.request(request)
puts response.read_body{
"applied": 123,
"rows": [
{
"cells": {},
"created_at": "2023-11-07T05:31:56Z",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"skipped": 123,
"stale_column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"recomputed_column_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Path Parameters
Body
Request body for the bulk cell write: all-or-nothing, one recompute run.
The cell edits to apply.
1 - 1000 elementsShow child attributes
Show child attributes
History only: set by the grid's undo and redo, which put back exactly what a cell held before. A Select or Multi-select value the column's options no longer name is then written back as it was, and no option is added; a number goes back with every digit it had, unrounded. Every other writer, AI agents and integrations included, leaves it false: a new value must be one of the column's options, and a number is rounded to the column's places.
Response
Successful Response
Read-your-writes result of a bulk cell write. Never carries a run ID.
rows covers every row named by the request, including ones whose edits
were all same-value no-ops, so the client can reconcile its whole
selection in one pass.
Edits that changed a value and were written.
Show child attributes
Show child attributes
Same-value edits that wrote nothing.
Transitive formula dependents now marked stale across all edited rows.
Formula columns recomputed INLINE within this request. Their values in rows are final and no background run was requested. Empty when a run was queued instead.
Was this page helpful?