-
Notifications
You must be signed in to change notification settings - Fork 1
REST API Reference
Complete endpoint catalog as of v0.10.0. All routes are defined as
constants in shared/.../ApiPath.kt; copy them into your client to stay
wire-compatible.
All /api/* routes (except /api/auth/setup, /api/auth/setup/status,
/api/auth/login, and /health) require Bearer authentication:
Authorization: Bearer <token>
Obtain a token with POST /api/auth/login. The same token works with both
the header and the vibe_session cookie path.
http://<host>:17880
For LAN deployments. HTTPS is the operator's responsibility (reverse proxy recommended for non-LAN exposure).
Check whether an admin user exists. Used by clients to decide between login and setup screen.
curl http://localhost:17880/api/auth/setup/status
# → {"adminExists": true}Create the first admin user (only when no admin exists). Returns
409 Conflict if one already exists.
curl -X POST http://localhost:17880/api/auth/setup \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"ChangeMe123","deviceName":"my-laptop"}'
# → {"token":"...","deviceId":"...","serverName":"...","username":"admin"}curl -X POST http://localhost:17880/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"ChangeMe123","deviceName":"my-android"}'
# → {"token":"...","deviceId":"...","serverName":"...","username":"admin"}10 consecutive failures lock the account for 15 minutes (timing-safe).
Change password. Requires Bearer auth.
curl -X POST http://localhost:17880/api/auth/password \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{"currentPassword":"old","newPassword":"new"}'
# → 204 No ContentHigh-level summary.
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:17880/api/server/status{
"serverName": "Vibe Coder Server",
"serverVersion": "0.10.0",
"osName": "Linux 6.x",
"javaVersion": "17.0.19",
"workspaceRoot": "/workspace",
"projectCount": 3,
"runningTaskCount": 0,
"claudeAvailable": true,
"androidSdkAvailable": true,
"gitAvailable": true,
"freeDiskSpaceBytes": 102400000000
}Detailed per-component diagnostics.
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:17880/api/projects
# → [{"id":"my-app","name":"My App","packageName":"...", ...}]Empty project:
curl -X POST http://localhost:17880/api/projects/register \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{
"projectId": "my-app",
"appName": "My App",
"packageName": "com.siamakerlab.myapp"
}'Clone from git:
curl -X POST http://localhost:17880/api/projects/register \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{
"projectId": "my-app",
"appName": "My App",
"packageName": "com.siamakerlab.myapp",
"sourceType": "clone",
"cloneUrl": "https://github.com/owner/repo.git",
"cloneBranch": "main"
}'Private SSH URL — first register a PAT or generate an SSH key via the Git integrations endpoints below.
Queue a debug build. Returns immediately with a BuildDto; stream live
output via /ws/projects/{id}/builds/{buildId}/logs.
List recent builds.
Send SIGTERM (then SIGKILL after 5 s) to the build subprocess.
Stream the produced APK.
curl -X POST http://localhost:17880/api/projects/my-app/claude/console/prompt \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"text":"Add a settings screen with a dark mode toggle"}'
# → 202 Accepted (response streamed over WebSocket)Tear down the current session and start fresh (--resume <id> is dropped).
Model, plan, quota remaining (cached 60 s).
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:17880/api/env-setup/components{
"components": [
{"id":"java","displayName":"JDK 17","status":"INSTALLED","installable":false, ...},
{"id":"android-sdk","displayName":"Android SDK","status":"MISSING","installable":true, ...},
{"id":"claude-auth","displayName":"Claude 로그인","status":"INSTALLED","installable":false, ...}
]
}Trigger sequential install of every installable component. Returns
{"taskId":"..."}. Subscribe to /ws/env-setup/{taskId}/logs for live
output.
Install a specific component (e.g. android-sdk).
Upload .credentials.json obtained on another machine.
curl -X POST http://localhost:17880/api/env-setup/claude-auth/upload \
-H "Authorization: Bearer $TOKEN" \
-F "file=@$HOME/.claude/.credentials.json"
# → {"targetPath":"/home/vibe/.claude/.credentials.json", ...}curl -X POST http://localhost:17880/api/env-setup/claude-auth/api-key \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"apiKey":"sk-ant-..."}'
# → 204 No ContentRemove the API key (also accepts POST for clients that lack DELETE).
Spawn claude auth login wrapped in script -q. Returns the initial
state.
curl -X POST http://localhost:17880/api/env-setup/claude-login/start \
-H "Authorization: Bearer $TOKEN"{
"id":"task-...",
"state":"STARTING",
"url":null,
"startedAt":"2026-05-23T12:00:00Z",
"updatedAt":"2026-05-23T12:00:00Z",
"errorMessage":null,
"lastLines":[]
}Poll /api/env-setup/claude-login/status every 1 s until state becomes
AWAITING_CODE (and url is set).
Same shape as above. Returns 204 if no session active.
curl -X POST http://localhost:17880/api/env-setup/claude-login/submit \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"code":"abc...#xyz"}'State → VERIFYING, then DONE or FAILED.
Destroy the child process. State → CANCELED.
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:17880/api/env-setup/mcp{
"entries": [
{
"id":"github",
"displayName":"GitHub",
"pkg":"@modelcontextprotocol/server-github",
"description":"...",
"category":"Git 호스팅 (GitHub / GitLab / Gitea / Bitbucket)",
"trust":"VERIFIED",
"recommended":true,
"homepage":null,
"configFields":[
{"key":"GITHUB_PERSONAL_ACCESS_TOKEN","label":"GitHub PAT","placeholder":"ghp_...","isSecret":true,"required":true,"help":"..."}
],
"status":"NOT_INSTALLED",
"configValues":{}
},
...
]
}curl -X POST http://localhost:17880/api/env-setup/mcp/install \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{
"selections": {
"filesystem": {},
"github": {"GITHUB_PERSONAL_ACCESS_TOKEN":"ghp_..."},
"context7": {}
}
}'
# → {"taskId":"..."} (subscribe to /ws/env-setup/{taskId}/logs)Removes entries from .mcp.json. The npm package itself stays on disk.
curl -X POST http://localhost:17880/api/env-setup/mcp/unregister \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"ids":["github","slack"]}'
# → 204 No ContentList registered PATs (masked) + SSH public key.
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:17880/api/settings/git-integrations{
"tokens": [
{"provider":"github","host":"github.com","username":"x-access-token","tokenMasked":"••••••••wxyz","createdAt":"2026-05-23T12:00:00Z","note":null}
],
"sshPublicKey": "ssh-ed25519 AAAA... vibe-coder"
}curl -X POST http://localhost:17880/api/settings/git-integrations \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{
"provider":"github",
"host":"github.com",
"username":"x-access-token",
"token":"ghp_...",
"note":"vibe-coder PAT, expires 2026-12"
}'
# → 204 No Contentcurl -X POST http://localhost:17880/api/settings/git-integrations/delete \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"host":"github.com"}'Generate ed25519 key pair if missing. Returns the full state including the public key for the user to copy.
{
"code": "missing_clone_url",
"message": "sourceType=clone 일 때 cloneUrl 이 필수입니다.",
"detail": null
}HTTP status codes: 400 bad input, 401 no/invalid token, 403 insufficient
permission, 404 not found, 409 conflict, 413 payload too large, 502
upstream failed (git clone, npm install), 504 timeout.