{"openapi":"3.0.3","info":{"title":"e2a.bot API","version":"1.0.0","description":"Build AI agent applications with isolated sandboxes, real-time streaming, and BYO LLM keys.","contact":{"email":"support@e2a.bot"}},"servers":[{"url":"https://api.e2a.bot","description":"Control plane"},{"url":"wss://rt.e2a.bot","description":"WebSocket runtime"}],"paths":{"/v1/auth/login":{"post":{"summary":"Request OTP","description":"Send a one-time password to your email for authentication.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"OTP sent"}}}},"/v1/auth/verify-otp":{"post":{"summary":"Verify OTP","description":"Verify OTP code and receive a JWT token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","code"],"properties":{"email":{"type":"string","format":"email"},"otp":{"type":"string"}}}}}},"responses":{"200":{"description":"JWT issued","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"JWT token"},"user_id":{"type":"string"},"email":{"type":"string"}}}}}}}}},"/v1/api-keys":{"post":{"summary":"Create API key","description":"Create a new long-lived API key. The full secret is returned ONCE.","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"API key created","content":{"application/json":{"schema":{"type":"object","properties":{"key_id":{"type":"string"},"key":{"type":"string","description":"Full secret - shown once"},"prefix":{"type":"string"}}}}}}}},"get":{"summary":"List API keys","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of API keys (secrets not returned)"}}}},"/v1/sandboxes":{"post":{"summary":"Create sandbox","description":"Create a new isolated sandbox. Optionally attach an agent for one-shot execution.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["template"],"properties":{"template":{"type":"string","enum":["standard","browser","cua","canvas"]},"agent":{"type":"string","enum":["deictic","claude-code","codex"]},"llm_key":{"type":"string","description":"Required if agent is set"},"task":{"type":"string","description":"One-shot prompt"},"model":{"type":"string"},"idle_timeout_seconds":{"type":"integer","default":60},"max_lifetime_seconds":{"type":"integer","default":7200}}}}}},"responses":{"201":{"description":"Sandbox created","content":{"application/json":{"schema":{"type":"object","properties":{"vm_id":{"type":"string"},"state":{"type":"string"},"host_port":{"type":"integer"}}}}}}}},"get":{"summary":"List sandboxes","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of sandboxes"}}}},"/v1/sandboxes/{id}":{"get":{"summary":"Get sandbox","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sandbox details"}}},"delete":{"summary":"Destroy sandbox","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sandbox destroyed"}}}},"/v1/sandboxes/{id}/exec":{"post":{"summary":"Execute command","description":"Run a shell command inside the sandbox.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["command"],"properties":{"command":{"type":"string"}}}}}},"responses":{"200":{"description":"Command output","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"type":"string"}}}}}}}}},"/v1/sessions":{"post":{"summary":"Create session","description":"Create an interactive agent session. Returns a WebSocket URL for real-time multi-turn interaction. Sessions always run in interactive mode — for one-shot execution, use POST /v1/sandboxes with the task parameter instead.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["agent","app","template","llm","user_id"],"properties":{"agent":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["deictic","claude-code","codex"]},"version":{"type":"string"}}},"app":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Application identifier"},"set_id":{"type":"string","default":"default"}}},"template":{"type":"string","enum":["standard","browser","cua"]},"llm":{"type":"object","required":["vendor"],"properties":{"vendor":{"type":"string","enum":["anthropic","openai","google","deepseek"]},"model":{"type":"string"},"base_url":{"type":"string","format":"uri"}}},"secrets":{"type":"array","items":{"type":"string"},"description":"Secret bundle names (must contain LLM_API_KEY)"},"user_id":{"type":"string"},"ttl_seconds":{"type":"integer","default":3600}}}}}},"responses":{"201":{"description":"Session created","content":{"application/json":{"schema":{"type":"object","properties":{"chat_session_id":{"type":"string"},"jwt":{"type":"string"},"connect_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"}}}}}}}}},"/v1/sessions/resume":{"post":{"summary":"Resume session","description":"Resume an existing session on a fresh sandbox.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["chat_session_id"],"properties":{"chat_session_id":{"type":"string"},"ttl_seconds":{"type":"integer"}}}}}},"responses":{"200":{"description":"Session resumed with new JWT and connect_url"}}}},"/v1/tenants/me/secrets":{"post":{"summary":"Create secret bundle","description":"Store LLM API keys in AWS Secrets Manager. Use LLM_API_KEY as the key name.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","values"],"properties":{"name":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,62}$"},"values":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"responses":{"201":{"description":"Secret bundle created"}}},"get":{"summary":"List secret bundles","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of bundles (values not returned)"}}}},"/v1/tenants/me/secrets/{name}":{"get":{"summary":"Get secret bundle metadata","security":[{"bearerAuth":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bundle metadata (values not returned)"}}},"put":{"summary":"Rotate secret bundle","description":"Replace values. Running sessions receive new values via WebSocket without restart.","security":[{"bearerAuth":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bundle rotated, broadcast sent to running sessions"}}},"delete":{"summary":"Delete secret bundle","security":[{"bearerAuth":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bundle deleted"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key (e2a_live_...) or JWT token"}}}}