Sandbox API
Endpoints for managing developer sandbox lifecycle.
POST /api/v1/sandbox/provision
Provision a new developer sandbox. No authentication required.
Rate limit: 3 requests per IP per hour.
Request
{
"email": "dev@example.com",
"company_name": "Acme Corp",
"use_case": "Monitoring LLM agents in production"
}
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Work email (no disposable domains) |
company_name | string | Yes | Company name (2-255 chars) |
use_case | string | No | What you're building (max 1000 chars) |
Response (201)
{
"success": true,
"org_id": 42,
"login_url": "https://pilot.owkai.app/org/acme-corp-a1b2c3/login",
"api_key": "ask_sbx_xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"expires_at": "2026-04-24T00:00:00Z",
"dashboard_url": "https://pilot.owkai.app/org/acme-corp-a1b2c3/dashboard",
"docs_url": "https://docs.ascendowkai.com/getting-started/quick-start"
}
Errors
| Status | Detail |
|---|---|
| 409 | Email already registered for a sandbox |
| 422 | Invalid email or disposable domain |
| 429 | Rate limit exceeded (3/hour/IP) |
| 500 | Provisioning failed |
GET /api/v1/sandbox/status
Get sandbox status for the current organization.
Authentication: JWT or API key (Authorization: Bearer header).
Response (200)
{
"is_sandbox": true,
"status": "active",
"expires_at": "2026-04-24T00:00:00Z",
"days_remaining": 12,
"usage": {
"agents": { "used": 2, "limit": 3 },
"actions": { "used": 847, "limit": 10000 },
"mcp_servers": { "used": 1, "limit": 2 }
},
"conversion_url": "https://pilot.owkai.app/org/acme-corp-a1b2c3/upgrade"
}
For non-sandbox organizations, returns { "is_sandbox": false, "status": "not_sandbox" }.
POST /api/v1/sandbox/convert
Convert a sandbox to a paid subscription via Stripe checkout.
Authentication: JWT only (human action, not API key).
Request
{
"tier_name": "growth"
}
| Field | Type | Values |
|---|---|---|
tier_name | string | growth, enterprise, mega |
Response (200)
{
"success": true,
"checkout_url": "https://checkout.stripe.com/c/pay_xxxxx"
}
Redirect the user to checkout_url to complete payment. After successful payment, the sandbox is converted: is_sandbox is set to false, limits are upgraded, and the expiry is removed.
Errors
| Status | Detail |
|---|---|
| 400 | Not a sandbox organization |
| 403 | No organization context or API key auth (JWT required) |
| 500 | Failed to create checkout session |