Autenticación
Si no hay keys, la API es pública. Si creas al menos una key, POST /api/v1/build exige X-API-Key o Authorization: Bearer ib_.... Genera y gestiona keys abajo. Las keys se guardan en data/apikeys.json (ignorado en git, no se sube).
curl -H "X-API-Key: ib_xxx" https://TU_DOMINIO/api/v1/build -d '{"url":"https://example.com","name":"MiApp"}'
Endpoints
POST /api/build compilar
Body `appName, url|htmlCode, packageName, permissions{}, plugins{}, compileSdk, outputType (apk/aab/both), platform` → {id, branch, status} 202. Usa `token GitHub` en servidor.
curl -X POST /api/build -H "Content-Type: application/json" -d '{"appName":"Mi Tienda","url":"https://mi-tienda.com","packageName":"com.miempresa.miapp","permissions":{"gps":true,"cameraMic":true}}'
POST /api/v1/build API key
Alias de `/api/build` con auth si hay keys. Campos `url, name, package, output, permissions, plugins, webhookUrl`.
curl -X POST /api/v1/build -H "X-API-Key: ib_xxx" -H "Content-Type: application/json" -d '{"url":"https://example.com","name":"MiApp","package":"com.example.app"}'
GET /api/build/:id +
GET /api/v1/build/:id
Polling cada 3s: `status queued|building|success|failed`, `step`, `runUrl`, `apkUrl`.
curl /api/build/abc123
# → {"id":"abc123","status":"success","apkUrl":"/api/download/abc123"}
GET /api/download/:id APK /aab /ipa
Descarga directa ZIP→APK/AAB. Si no hay `runId` → 404 aún en progreso.
POST /api/project ZIP
Genera proyecto nativo ZIP sin compilar en GitHub. Útil para CI local.
curl -X POST /api/project -H "Content-Type: application/json" -d '{"appName":"Test","url":"https://example.com"}' --output proyecto.zip
GET /api/analyze?url= +
POST /api/analyze/html +
POST /api/analyze/fix
Security `score/level/issues`, `errors/warnings`, `optimization grade/tips`, `autoFix preview`. Para HTML directo usa `POST`.
curl "/api/analyze?url=https://example.com"
curl -X POST /api/analyze/html -d '{"html":"..."}'
POST /api/decompile APK
Sube APK (`apkBase64` dataURL/base64 o `octet-stream` raw, max 30MB) → extrae `packageName, permissions, hasDex, fileCount, manifestPreview, importConfig` (re-importable en Studio).
curl -X POST /api/decompile -H "Content-Type: application/json" -d '{"apkBase64":"data:application/vnd.android.package-archive;base64,UEs..."}'
API Keys `GET /api/keys` `POST /api/keys {name}` `DELETE /api/keys/:id`
panel
Máx 10 keys. `keyMask` en listado, `key` solo al crear (cópiala).
Git `POST /api/git/connect {repo, branch}` `GET /api/git/integrations` `POST /api/git/webhook`
Conecta `usuario/repo#branch` → cada `push` dispara `startBuild`. Webhook: `{"repository":{"full_name":"u/r"},"ref":"refs/heads/main"}`
Otros `GET /api/health`, `GET /api/diag`, `GET /api/stats`, `GET /api/history`, `GET /api/qr/:id`, `GET /api/apk-info/:id`, `GET /api/docs`
Ejemplos
Node.js
const r=await fetch(base+'/api/v1/build',{method:'POST',headers:{'Content-Type':'application/json','X-API-Key':key},body:JSON.stringify({url:'https://example.com',name:'MiApp'})});
const {buildId}=await r.json();
let s; do{ await new Promise(r=>setTimeout(r,3000)); s=await (await fetch(base+'/api/v1/build/'+buildId)).json(); console.log(s.status, s.step);}while(s.status==='building')
console.log(s.apkUrl)
Python
import requests, time
r=requests.post(base+"/api/v1/build", headers={"X-API-Key":key}, json={"url":"https://example.com","name":"MiApp"})
bid=r.json()["buildId"]
while True:
s=requests.get(base+f"/api/v1/build/{bid}").json()
print(s["status"]);
if s["status"] not in ("queued","building"): break
time.sleep(3)