Docs / Reference
API
10 minute read
A REST API with JSON over HTTPS. Every console action has an endpoint, and every call lands in the audit log with the key that made it.
1. Create an API key
Open API, CLI & Terraform → New API key. Give it a name, a role and an expiry. The key is shown once; store it in a secret manager.
A key belongs to the organisation and carries one role, like a teammate would. Keys can't create keys or change team access.
export SIMPLICLOUD_TOKEN="sc_live_…"export ORG="korafoods"
2. Make a request
Every URL starts with https://console.simplicloud.ai/api/v1/orgs/$ORG, where $ORG is your organisation's slug. Send the key as a bearer token.
curl https://console.simplicloud.ai/api/v1/orgs/$ORG/servers \-H "Authorization: Bearer $SIMPLICLOUD_TOKEN"{"data": [{ "id": "ops-box", "status": "running", "plan": "s2","region": "los1", "private_ip": "172.30.4.10", "ssh_port": 20009 }],"next_cursor": null}
- Send JSON with
Content-Type: application/json. - Times are ISO 8601 in UTC, like
2026-11-14T09:30:00Z. - Prices are whole naira, before VAT.
- Add
?project=stagingto work outside the Production project.
3. Endpoints
The main resources. Each also supports GET /<resource>/{id} to read one item.
| Method | Path | What it does |
|---|---|---|
| GET | /servers | List servers |
| POST | /servers | Create a server: name, plan, image, ssh_keys |
| PATCH | /servers/{id} | Resize or turn backups on: plan, backups |
| POST | /servers/{id}/actions | Power: {"type":"reboot"}, power_off, power_on |
| DELETE | /servers/{id} | Delete a server |
| GET, POST | /apps | List or create apps: name, repo, branch, plan |
| POST | /apps/{id}/deploys | Start a deploy |
| PUT | /apps/{id}/env/{key} | Set an environment variable |
| GET, POST | /databases | List or create databases: engine, version, plan |
| GET, POST | /databases/{id}/users | List or add database users |
| GET, POST | /buckets | List or create Spaces buckets: name, acl |
| GET, POST | /volumes | List or create volumes: name, size_gb, server |
| GET, POST | /snapshots | List or take snapshots |
| GET, POST | /domains | List or add domains |
| GET, POST | /domains/{domain}/records | List or add DNS records: type, name, value, ttl |
| GET | /billing/wallet | Balance and estimated days left |
| GET | /billing/invoices | Monthly VAT invoices |
4. Create things
A database and a DNS record, for example:
curl -X POST https://console.simplicloud.ai/api/v1/orgs/$ORG/databases \-H "Authorization: Bearer $SIMPLICLOUD_TOKEN" \-H "Content-Type: application/json" \-d '{"name":"orders-db","engine":"postgresql","version":"16","plan":"standard"}'curl -X POST https://console.simplicloud.ai/api/v1/orgs/$ORG/domains/korafoods.ng/records \-H "Authorization: Bearer $SIMPLICLOUD_TOKEN" \-H "Content-Type: application/json" \-d '{"type":"CNAME","name":"www","value":"storefront.apps.simplicloud.ai","ttl":3600}'
Creating something slow, like a server or database, returns 202 Accepted with "status": "creating". Poll the item until it is running.
5. Pagination
List endpoints return up to 20 items. Ask for up to 100 with limit, and pass next_cursor from the last response as cursor to get the next page. When next_cursor is null, you have everything.
curl "https://console.simplicloud.ai/api/v1/orgs/$ORG/snapshots?limit=100&cursor=c_8f2a19" \-H "Authorization: Bearer $SIMPLICLOUD_TOKEN"
6. Errors and limits
Errors come back with a status code and a JSON body you can show to people:
HTTP/1.1 402 Payment Required{"error": {"code": "insufficient_funds","message": "Your wallet balance is too low to create this server. Top up to continue."}}
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | A field is missing or wrong. error.field names it. |
| 401 | unauthorized | The key is missing, wrong, expired or revoked. |
| 402 | insufficient_funds | The wallet can't cover the new resource. |
| 403 | forbidden | The key's role doesn't allow this action. |
| 404 | not_found | No such item in this organisation and project. |
| 409 | conflict | The name is taken, or the item is busy with another change. |
| 429 | rate_limited | More than 600 requests a minute for this key. Wait for Retry-After seconds. |
| 5xx | server_error | Our fault. Retry with backoff; the request ID is in X-Request-Id. |