🫧 bubbling.devDeveloper API

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/generate

Generate a new app from a text prompt.

Headers

AuthorizationBearer bub_live_YOUR_KEY *required
Content-Typeapplication/json

Request Body

json{
  "prompt": "A kanban board with drag-and-drop, localStorage, and dark mode"
}
promptstring, 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

401Invalid or missing API key
400Invalid prompt (empty, too long, or blocked by moderation)
429Daily limit reached
GET/api/v1/status/:id

Check the status of a generation. Poll this every 5–10 seconds.

Status Values

pendingQueued, waiting to start
generatingAI is writing code
deployingBuilding Docker image & deploying
doneLive! deployUrl is available
errorGeneration 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/apps

List 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

Need more?

Higher limits, custom domains, private deploys, and priority builds.

Contact Us