v1 · api.getctrl.dev
All public endpoints require an API key in the Authorization header:
Authorization: Bearer <api_key>
To obtain an API key, contact support@getctrl.dev. Self-serve key management is coming in a future release.
Internal routes (/internal/*) are not publicly accessible.
| Plan | vCPU | RAM | Disk | Price |
|---|---|---|---|---|
hobby | 1 | 2 GB | 30 GB | $5/mo |
builder | 2 | 4 GB | 60 GB | $15/mo |
pro | 4 | 8 GB | 100 GB NVMe | $75/mo |
scale | 8 | 16 GB | 200 GB NVMe | $140/mo |
Request headers:
Authorization: Bearer <api_key>
Content-Type: application/json
Request body:
{
"app_id": "my-api", // unique slug — becomes subdomain
"image_ref": "ghcr.io/acme/my-api:latest", // Docker image reference
"plan": "hobby", // hobby | builder | pro | scale
"region": "us-east",
"exposed_port": 8080,
"env_vars": [["PORT", "8080"]], // array of [key, value] pairs
"registry_auth": null // or { "username": "...", "password": "..." }
}
Response 201:
{
"app_id": "my-api",
"vm_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "starting",
"plan": "hobby",
"region": "us-east",
"node_id": "us-1",
"subdomain": "my-api.getctrl.dev"
}
Error responses:
app_id already in use