Base URL: http://localhost:8000/api/v1
All endpoints (except health) require X-API-Key header.
Health check. No authentication required.
Response:
{
"status": "ok",
"checks": {"database": "ok", "claude_cli": "ok"},
"meta": {"request_id": "...", "timestamp": "...", "version": "v1"}
}Create a new session.
Body:
{
"name": "my-project",
"template": "code-reviewer",
"system_prompt": "You are a Python expert",
"model": "claude-sonnet-4-20250514",
"effort": "high",
"max_turns": 50,
"permission_mode": "auto",
"allowed_tools": "Read,Write,Edit,Bash",
"disallowed_tools": "Glob"
}All fields except name are optional. template applies defaults that explicit fields override.
List sessions (paginated). Query params: page (default 1), limit (default 20).
Get session details.
Delete session. Returns 204 No Content.
Change working directory.
Body:
{
"working_dir": "/home/user/projects/other-repo"
}Send message (synchronous).
Body:
{
"message": "create a hello.py",
"model": "claude-sonnet-4-20250514",
"system": "You are a Python expert",
"effort": "high",
"permission_mode": "auto",
"output_format": {"type": "json"}
}Only message is required.
Headers:
Idempotency-Key: <uuid>— prevent duplicate execution
Response:
{
"data": {
"session_id": "...",
"content": "...",
"cost": 0.003,
"duration_ms": 4521,
"num_turns": 2,
"tools_used": [{"name": "Write", "input": {...}}]
},
"meta": {"request_id": "...", "timestamp": "...", "version": "v1"}
}Send message (SSE stream). Same body as sync chat.
Events:
| Event | Data |
|---|---|
assistant |
{"content": "...", "tool_name": null} |
tool |
{"content": null, "tool_name": "Read"} |
done |
Full response with cost, duration, tools |
error |
{"error": "..."} |
Get chat history. Query params: limit (default 50).
Create async job. Returns 202 Accepted.
Body:
{
"message": "run tests and fix failures",
"webhook_url": "https://your-server.com/hooks/claude",
"model": "claude-sonnet-4-20250514",
"system": "You are a test engineer",
"effort": "max",
"permission_mode": "auto",
"output_format": {"type": "json"}
}Only message is required.
List jobs for a session.
Get job status and result.
Cancel a queued or running job.
Upload file (multipart form).
Form fields:
file— the file (required)path— destination path within workspace (optional)
Max size: 10 MB.
List files in workspace.
Download a file.
List all available templates.
Get template details.
Hot-reload templates from templates.yml.
Estimate token count.
Body:
{
"text": "Your text here..."
}Response:
{
"data": {
"characters": 100,
"words": 20,
"estimated_tokens": 25
}
}Usage statistics. Query params: user_id (optional, defaults to API key).
Audit trail. Query params: user_id, limit (default 50, max 200).