

Create, edit, publish and download your apps from scripts, CI pipelines or your own tools.
Create a key in Settings > API keys. It is shown once, so store it somewhere safe such as your CI secrets. Send it on every request:
Authorization: Bearer bio_...https://app.builditomi.com/api/v1KEY="bio_..." # from Settings > API keys
API="https://app.builditomi.com/api/v1"
# 1. Start a build
ID=$(curl -s -X POST "$API/apps" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"prompt":"An appointment app for my clinic with doctors and time slots"}' | jq -r .id)
# 2. Keep building until it is done
until curl -s -X POST "$API/apps/$ID/step" -H "Authorization: Bearer $KEY" | jq -e .done > /dev/null; do sleep 1; done
# 3. Publish
curl -s -X POST "$API/apps/$ID/publish" -H "Authorization: Bearer $KEY"Builds run in steps so no single request runs too long. After creating or editing an app, call /step until it returns "done": true.
GET/apps
List your apps (up to 100, newest first).
Returns: { apps: [{ id, title, published, versions, building, updatedAt }] }
POST/apps
Start building a new app from a prompt. Add "stack": "react" for a multi-file React project.
Body: { "prompt": "A booking app for my salon" }
Returns: { id, done, steps }
POST/apps/{id}/step
Continue a build or edit. Call it until done is true.
Returns: { done, steps, title? }
GET/apps/{id}
App details, chat history and build progress.
Returns: { id, title, building, versions, published, history, draft }
POST/apps/{id}/edit
Change the app with a message, then call /step until done.
Body: { "message": "Add a contact form" }
Returns: { id, done, steps }
GET/apps/{id}/source
The app's HTML as text. Add ?files=1 to get every file of a React project as JSON.
Returns: text/html, or { stack, files: [{ path, content }] }
GET/apps/{id}/versions
Version list with the message that made each one.
Returns: { versions: [{ version, at, current, note }] }
POST/apps/{id}/versions
Restore an earlier version as the newest one.
Body: { "version": 3 }
Returns: { ok, version }
PATCH/apps/{id}
Rename the app.
Body: { "title": "Salon Booking" }
Returns: { id, title }
POST/apps/{id}/publish
Publish the current version.
Returns: { url, publishedAt }
DELETE/apps/{id}/publish
Take the app offline.
Returns: { ok }
DELETE/apps/{id}
Delete the app and its data.
Returns: { ok }
Errors return JSON like { "error": "What went wrong" } with one of these status codes:
400 The request is missing something or a value is not valid.401 The key is missing, wrong or revoked, or was sent to a route that does not accept keys.402 No active plan or running free hour, or this week's build usage is used up.403 A plan limit was reached.404 The app does not exist or is not yours.409 Something is already in progress, such as another build on the same app.429 Too many requests. Slow down and try again.