curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
},
{
"amount": 1800,
"status": "draft",
"customer_email": "jane@acme.com"
}
]
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload = [
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
},
{
"amount": 1800,
"status": "draft",
"customer_email": "jane@acme.com"
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{amount: 4200, status: 'draft', customer_email: 'jane@acme.com'},
{amount: 1800, status: 'draft', customer_email: 'jane@acme.com'}
])
};
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 => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'amount' => 4200,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
],
[
'amount' => 1800,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
]
]),
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 \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n }\n]")
req, _ := http.NewRequest("POST", 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.post("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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": {}
}
}Create entity records
Adds several records to one of the app’s entities in one call, and returns them in the order you sent them.
Send a JSON array of records, each written the same way as the body of Create entity record. 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. An empty array creates nothing and returns an empty array.
Every record is checked before any is written. If one record doesn’t match the entity’s schema, or the entity’s rls create rule or a field-level rule doesn’t cover it, the call is rejected and no records are created.
There’s no fixed limit on how many records one call creates, but the whole array is written before the response comes back, so split a very large import into several calls.
Each record is new, so retrying a call that already succeeded creates every record again. If a call fails while it’s writing, some of the records can already be stored, so check with List entity records before you retry.
Unlike Create 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 POST \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
},
{
"amount": 1800,
"status": "draft",
"customer_email": "jane@acme.com"
}
]
'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk"
payload = [
{
"amount": 4200,
"status": "draft",
"customer_email": "jane@acme.com"
},
{
"amount": 1800,
"status": "draft",
"customer_email": "jane@acme.com"
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{amount: 4200, status: 'draft', customer_email: 'jane@acme.com'},
{amount: 1800, status: 'draft', customer_email: 'jane@acme.com'}
])
};
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 => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'amount' => 4200,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
],
[
'amount' => 1800,
'status' => 'draft',
'customer_email' => 'jane@acme.com'
]
]),
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 \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n }\n]")
req, _ := http.NewRequest("POST", 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.post("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"amount\": 4200,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\n },\n {\n \"amount\": 1800,\n \"status\": \"draft\",\n \"customer_email\": \"jane@acme.com\"\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
Response
The created 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?