Generate apps with a single API call
Describe any app in plain English. Our API generates, builds, and deploys it as a live web app — ready to use in seconds.
Quick Start
1
Get an API key
Sign in below and create a key. Free tier: 20 builds/day.
2
Send a prompt
POST to /api/v1/generate with your app description.
3
Poll status & get the URL
Poll /api/v1/status/:id until status is done.
bash# Generate an app
curl -X POST https://bubbling.dev/api/v1/generate \
-H "Authorization: Bearer bub_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "A habit tracker with streak counting and calendar view"}'
# Response:
# {
# "id": "3a47378a-4c2f-4000-8eb3-8f79bfa17999",
# "status": "generating",
# "remaining": 19,
# "statusUrl": "https://bubbling.dev/api/v1/status/3a47...",
# "appUrl": "https://bubbling.dev/app/3a47..."
# }
# Poll until done
curl https://bubbling.dev/api/v1/status/3a47378a-4c2f-4000-8eb3-8f79bfa17999 \
-H "Authorization: Bearer bub_live_YOUR_KEY"
# Response when ready:
# {
# "id": "3a47378a-...",
# "status": "done",
# "deployUrl": "http://bubbling-3a47378a-....sslip.io",
# "appUrl": "https://bubbling.dev/app/3a47..."
# }API Keys
Sign in with Google to create API keys
API Reference
POST
/api/v1/generateGenerate a new app from a text prompt.
Headers
| Authorization | Bearer bub_live_YOUR_KEY *required |
| Content-Type | application/json |
Request Body
json{
"prompt": "A kanban board with drag-and-drop, localStorage, and dark mode"
}| prompt | string, 1–10,000 chars. Your app description. *required |
Response (200)
json{
"id": "3a47378a-4c2f-4000-8eb3-8f79bfa17999",
"status": "generating",
"remaining": 19,
"statusUrl": "https://bubbling.dev/api/v1/status/3a47378a-...",
"appUrl": "https://bubbling.dev/app/3a47378a-..."
}Errors
| 401 | Invalid or missing API key |
| 400 | Invalid prompt (empty, too long, or blocked by moderation) |
| 429 | Daily limit reached |
GET
/api/v1/status/:idCheck the status of a generation. Poll this every 5–10 seconds.
Status Values
| pending | Queued, waiting to start |
| generating | AI is writing code |
| deploying | Building Docker image & deploying |
| done | Live! deployUrl is available |
| error | Generation failed |
Response (200)
json{
"id": "3a47378a-...",
"status": "done",
"deployUrl": "http://bubbling-3a47378a-....sslip.io",
"prompt": "A habit tracker with streak counting...",
"createdAt": 1711568400000,
"appUrl": "https://bubbling.dev/app/3a47378a-..."
}GET
/api/v1/appsList all apps generated with your API key.
json{
"apps": [
{
"id": "3a47378a-...",
"prompt": "A habit tracker...",
"status": "done",
"deployUrl": "http://bubbling-3a47378a-....sslip.io",
"appUrl": "https://bubbling.dev/app/3a47378a-...",
"createdAt": 1711568400000,
"views": 42
}
],
"total": 1
}Code Examples
Python
pythonimport requests, time
API_KEY = "bub_live_YOUR_KEY"
BASE = "https://bubbling.dev/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
# 1. Generate
resp = requests.post(f"{BASE}/generate", json={
"prompt": "A personal finance tracker with charts and budget categories"
}, headers=HEADERS)
data = resp.json()
app_id = data["id"]
print(f"Generating... ID: {app_id}")
# 2. Poll until done
while True:
status = requests.get(f"{BASE}/status/{app_id}", headers=HEADERS).json()
print(f" Status: {status['status']}")
if status["status"] in ("done", "error"):
break
time.sleep(10)
# 3. Get the live URL
if status["status"] == "done":
print(f"Live at: {status['deployUrl']}")
print(f"Share: {status['appUrl']}")JavaScript / Node.js
javascriptconst API_KEY = "bub_live_YOUR_KEY";
const BASE = "https://bubbling.dev/api/v1";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
// 1. Generate
const res = await fetch(`${BASE}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
prompt: "A kanban board with drag-and-drop and dark mode",
}),
});
const { id } = await res.json();
console.log("Generating...", id);
// 2. Poll until done
let app;
while (true) {
const r = await fetch(`${BASE}/status/${id}`, { headers });
app = await r.json();
console.log(" Status:", app.status);
if (app.status === "done" || app.status === "error") break;
await new Promise((r) => setTimeout(r, 10000));
}
// 3. Get the live URL
if (app.status === "done") {
console.log("Live at:", app.deployUrl);
console.log("Share: ", app.appUrl);
}cURL
bash# Generate
curl -X POST https://bubbling.dev/api/v1/generate \
-H "Authorization: Bearer bub_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "A recipe finder that filters by ingredients I have"}'
# Check status (replace APP_ID with the id from above)
curl https://bubbling.dev/api/v1/status/APP_ID \
-H "Authorization: Bearer bub_live_YOUR_KEY"
# List all your apps
curl https://bubbling.dev/api/v1/apps \
-H "Authorization: Bearer bub_live_YOUR_KEY"Limits & Pricing
Free Tier
- ✓ 20 builds per day per API key
- ✓ Full Vite + React + Tailwind stack
- ✓ Auto-deployed on our infrastructure
- ✓ Shareable URLs for every app
- ✓ Up to 5 API keys per account