Save several app files
Changed on<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>
Saves several files into the app in one call, the way the app editor does.
Send up to 50 files. Every path is validated before anything is written, so one bad path fails the whole batch with a 400 and leaves the app untouched. An empty files list is a 400 rather than a no-op.
This route never deploys, so it refuses backend code: a path under functions/ answers 422 rather than writing source that the live function wouldn't match. Use Save an app file for those, one at a time, and this one for the frontend files a visual edit touches.
Internally this route can follow a feature branch, but the parameter that selects one isn't part of the public API, so writes through this endpoint land on the app's main line.
The response is the app document as it stands after the change, the same shape Get app returns.
<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>
<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>
Request
- Base URL: https://app.base44.com
- URL: https://app.base44.com/api/apps/{app_id}/coding/write-batch
- Auth: HTTP bearer
Path parameters
ID of the app whose code to change.
Request body
Example request
{
"files": [
{
"content": "export default function About() {\n return <h1>About</h1>;\n}\n",
"file_path": "src/pages/About.jsx"
},
{
"content": "export default function Home() {\n return <h1>Home</h1>;\n}\n",
"file_path": "src/pages/Home.jsx"
}
]
}Response
The app after the writes.
Example response
{
"id": "6820f3a4e7b91d003c45a1f2",
"created_date": "2026-08-01T09:15:00",
"updated_date": "2026-08-02T14:30:00",
"created_by": "developer@example.com",
"organization_id": "67e0b12c4d8a3f005b21c9e4",
"app_type": "user_app",
"name": "My CRM",
"user_description": "A CRM to track leads and deals",
"logo_url": "https://storage.base44.com/6820f3a4e7b91d003c45a1f2/3f2504e0_logo.png",
"social_image_url": "https://storage.base44.com/6820f3a4e7b91d003c45a1f2/7c9e6679_social.png",
"public_settings": "public_with_login",
"auth_config": {
"enable_username_password": true,
"enable_google_login": true
},
"hide_entity_created_by": true,
"slug": "my-crm-3c45a1f2",
"last_deployed_at": "2026-08-02T14:30:00",
"screenshot_url": "https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png",
"preview_screenshot_url": "https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png",
"owner_id": "6706af53b9c1e2004a37d85f",
"status": {
"state": "ready",
"details": "Publishing app",
"request_id": "a1b2c3d4e5f67890abcdef12",
"last_updated_date": "2026-08-02T14:30:00Z",
"error_source": "build",
"paywall_context": {
"billing_organization_id": "67e0b12c4d8a3f005b21c9e4",
"user_id": "6706af53b9c1e2004a37d85f",
"evaluated_at": "2026-08-02T14:30:00Z"
}
}
}Changes
- info
the endpoint scheme security
PersonalAccessTokenAuthwas added to the API
- info
- breaking
the
response's property type changed from no type toobjectfor status - breaking
the
response's property type changed from no type toobjectfor status - warning
added the new
private_with_loginenum value to theresponse property for the response status - warning
added the new
public_with_loginenum value to theresponse property for the response status - warning
added the new
public_without_loginenum value to theresponse property for the response status - warning
added the new
workspace_with_loginenum value to theresponse property for the response status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
removed
subschema #2from theresponse propertyanyOflist for the response status - info
removed
subschema #2from theresponse propertyanyOflist for the response status - info
the
response's property default valueuser_appwas added for the status - info
the
response's property default valuefalsewas added for the status - info
the
response's property default valuefalsewas added for the status - info
the
response's property default valuefalsewas added for the status - info
the
response's property default valuefalsewas added for the status - info
the
response's property default valuefalsewas added for the status - info
the
response's property default valueuntitledwas added for the status - info
the
response's property default valuepublic_with_loginwas added for the status - info
response property
app_typelist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
created_datelist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
dev_environment_enabledlist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
hide_entity_created_bylist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
idlist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
is_remixablelist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
is_unpublishedlist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
main_branch_protectedlist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
namelist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
public_settingslist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
response property
updated_datelist-of-types was narrowed by removing typesnullfrom media typeapplication/jsonof response200 - info
added the required property
/to the response with the status
- breaking