curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"id": "6886b8d390dc7e2f4a2c91b3",
"status": "paid"
},
{
"id": "6886b8d390dc7e2f4a2c91b4",
"amount": 1800
}
]
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload = [
{
"id": "6886b8d390dc7e2f4a2c91b3",
"status": "paid"
},
{
"id": "6886b8d390dc7e2f4a2c91b4",
"amount": 1800
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{id: '6886b8d390dc7e2f4a2c91b3', status: 'paid'},
{id: '6886b8d390dc7e2f4a2c91b4', amount: 1800}
])
};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
[
'id' => '6886b8d390dc7e2f4a2c91b3',
'status' => 'paid'
],
[
'id' => '6886b8d390dc7e2f4a2c91b4',
'amount' => 1800
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload := strings.NewReader("[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.put("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]"
response = http.request(request)
puts response.read_body[
{
"id": "6886b8d390dc7e2f4a2c91b3",
"created_date": "2026-06-01T09:23:41.481000",
"updated_date": "2026-06-04T14:07:02.115000",
"created_by": "jane@acme.com",
"created_by_id": "6874b0c2e1a94d0031bb77de",
"is_sample": false
}
]{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}Update entity records
Changes several records in one of the app’s entities, each with its own fields, and returns the updated records in the order you sent them.
Send a JSON array of up to 500 objects. Each one carries the id of a record and the fields to change on it, and an id can appear only once. Like Update entity record, this merges rather than replaces, so a field you leave out keeps its value. Fields the entity’s schema doesn’t declare are left out of the record instead of failing the call.
Every record is checked before any is written. If one id matches no record the entity’s rls update rule lets you change, or one record doesn’t match the entity’s schema or a field-level rule, the call is rejected and no records change.
Sending the same array again sets the same values, so a retry is safe. Unlike Update entity record, this doesn’t trigger the app’s webhooks, automations, or workflows.
Runs as your user in this app, so the app’s access rules decide which records you can read or change.
curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"id": "6886b8d390dc7e2f4a2c91b3",
"status": "paid"
},
{
"id": "6886b8d390dc7e2f4a2c91b4",
"amount": 1800
}
]
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload = [
{
"id": "6886b8d390dc7e2f4a2c91b3",
"status": "paid"
},
{
"id": "6886b8d390dc7e2f4a2c91b4",
"amount": 1800
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{id: '6886b8d390dc7e2f4a2c91b3', status: 'paid'},
{id: '6886b8d390dc7e2f4a2c91b4', amount: 1800}
])
};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
[
'id' => '6886b8d390dc7e2f4a2c91b3',
'status' => 'paid'
],
[
'id' => '6886b8d390dc7e2f4a2c91b4',
'amount' => 1800
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload := strings.NewReader("[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.put("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"status\": \"paid\"\n },\n {\n \"id\": \"6886b8d390dc7e2f4a2c91b4\",\n \"amount\": 1800\n }\n]"
response = http.request(request)
puts response.read_body[
{
"id": "6886b8d390dc7e2f4a2c91b3",
"created_date": "2026-06-01T09:23:41.481000",
"updated_date": "2026-06-04T14:07:02.115000",
"created_by": "jane@acme.com",
"created_by_id": "6874b0c2e1a94d0031bb77de",
"is_sample": false
}
]{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Scopes
Path Parameters
Name of the entity, exactly as List entity schemas reports it. Don't pass User here. It doesn't fail, but it reads and writes a separate, disconnected set of records stored under that name, not the app's real user accounts, which are managed through their own endpoints.
Body
ID of the record to change, as id in the response of List entity records.
"6886b8d390dc7e2f4a2c91b3"
Response
The updated records.
ID of the record. Pass it as entity_id to Get entity record, Update entity record or Delete entity record.
"6886b8d390dc7e2f4a2c91b3"
Was this page helpful?