curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id} \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}"
payload = {
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 4200, status: 'draft', customer_email: 'jane@acme.com'})
};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}', 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}/{entity_id}",
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([
'amount' => 4200,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}"
payload := strings.NewReader("{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("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.put("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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
}Update entity record
Changes the fields you send on one record and returns the whole updated record.
This merges rather than replaces. A field you leave out keeps the value it already has, so you can send a single field on its own. Only the fields the entity’s schema declares are stored, so a misspelled name is left out of the record instead of failing the call. Base44 always assigns id, created_date, updated_date, created_by, and created_by_id automatically, and ignores any of them you send.
Row-level security applies, so the call is rejected when the entity’s rls update rule doesn’t cover this record. If field-level rules refuse a change to any field you’re sending, the whole call is rejected too, and none of the fields update.
Updating a record triggers the app’s webhooks and any automation or workflow that listens for this entity.
curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id} \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}"
payload = {
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 4200, status: 'draft', customer_email: 'jane@acme.com'})
};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}', 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}/{entity_id}",
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([
'amount' => 4200,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}"
payload := strings.NewReader("{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("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.put("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/{entity_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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
}Authorizations
Personal API key.
Path Parameters
ID of the record, as id in the response of List entity records.
ID of the app that owns the entity.
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
The record's fields, as a flat JSON object using the names the entity's schema declares.
Response
The updated record.
One record in one of an app's entities.
ID of the record. Pass it as entity_id to Get entity record, Update entity record or Delete entity record.
"6886b8d390dc7e2f4a2c91b3"
When the record was created, as a UTC timestamp in ISO 8601 format. A record Base44 has just created carries a Z suffix, and a record read back from storage does not.
"2026-06-01T09:23:41.481000"
When the record last changed, as a UTC timestamp in ISO 8601 format. A record Base44 has just created carries a Z suffix, and a record read back from storage does not.
"2026-06-04T14:07:02.115000"
Email of the app user who created the record, or anonymous when a visitor created it on an app that needs no login. Apps that hide record authorship leave this field out of the response.
"jane@acme.com"
ID of the app user who created the record, or anonymous when a visitor created it on an app that needs no login.
"6874b0c2e1a94d0031bb77de"
Whether Base44 stored the record as sample data while the app was being built. A record you create reports false.
false
Was this page helpful?