Everything the console does, the API does.
REST API v1 at /api/v1 with Bearer tokens and scopes, covering quotes, deployments, power actions, reinstalls, password resets, snapshots, live stats, billing, invoices, tickets and status. Tokens are shown once, stored hashed, and can carry an expiry and an IP allow-list.
Know the price. Then watch it boot.
# price a shape before deploying — same numbers as the deploy page curl -s https://joy.services/api/v1/quote \ -H "Authorization: Bearer $JOY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"region":"mumbai","plan":"small","os":"ubuntu-24.04","cycle":"monthly"}' # → {"monthly":10.47,"hourly":0.014,"currency":"USD","total":10.47}
# create returns a job id; poll it until the instance is running curl -s -X POST https://joy.services/api/v1/instances \ -H "Authorization: Bearer $JOY_TOKEN" \ -d '{"region":"mumbai","plan":"small","os":"ubuntu-24.04","cycle":"hourly","hostname":"web-1"}' # → {"job":"job_8f3a…","instance":"inst_51c2…"} curl -s https://joy.services/api/v1/jobs/job_8f3a… -H "Authorization: Bearer $JOY_TOKEN" # → {"status":"running","steps":["clone","configure","boot","agent","network","ready"],"current":"agent"}
Scoped tokens, honest limits.
| Scope | Grants |
|---|---|
| read | List instances, read stats, invoices, tickets, status |
| orders.write | Quotes and new deployments |
| instances.write | Power actions, reinstalls, password resets, snapshots, resizes |
| billing.read | Wallet, invoices and payments |
| * | Everything the account can do |
| Limit | Value |
|---|---|
| Requests | 600 per minute per token (429 with Retry-After beyond that) |
| Deployments | 10 per hour per account |
| Power actions | 10 per minute per instance |
| Password resets | 3 per 10 minutes |
Team access with 2FA
Invite colleagues under Account → Security → Team; each signs in with their own credentials and TOTP. Access is scoped and revocable.
Every action logged
What was created, changed, billed or deleted, by whom and when, including staff actions, in your audit log.
Machine-readable status
/status.json carries component health per region, refreshed every 30 seconds, for your own dashboards and alerts.
Job and event delivery
Deployment steps, power events and billing events posted to your endpoint; poll GET /api/v1/jobs/{id} where you prefer.
How do I create a token?
Under Account → API in the console. Tokens are shown once, stored hashed, carry scopes (read, orders.write, instances.write, billing.read or *), can have an expiry and an IP allow-list.
Can I get a price before deploying?
POST /api/v1/quote returns monthly, hourly and total prices in your currency for any region, plan or custom shape and cycle, the same numbers the deploy page shows.
How do I track a deployment?
Create returns a job id; poll GET /api/v1/jobs/{id} for the steps (clone → configure → boot → agent → network → ready) and read credentials from the instance once it is running.