One contract, not one surface
The OpenAPI document is generated from the handlers’ own validation schemas. An endpoint can’t accept anything the spec doesn’t describe. How it works
Every API operation exists as an HTTP call, a CLI command, an SDK method, and an MCP tool call. All four are generated from the same contract, so they can’t contradict each other.
curl https://api.truo.cloud/v1/services \ -H "Authorization: Bearer $TRUO_TOKEN"
curl https://api.truo.cloud/v1/vps/svc_10432/power \ -X POST \ -H "Authorization: Bearer $TRUO_TOKEN" \ -H "Content-Type: application/json" \ -d '{"action":"stop"}'truo auth logintruo services listtruo vps power svc_10432 stopimport { TruoClient } from "@truocloud/sdk";
const truo = new TruoClient(); // reads TRUO_TOKEN
for await (const svc of truo.services.listAll()) console.log(svc.id);
const op = await truo.vps.power("svc_10432", { action: "stop" });await truo.operations.wait(op.id);One contract, not one surface
The OpenAPI document is generated from the handlers’ own validation schemas. An endpoint can’t accept anything the spec doesn’t describe. How it works
Credentials you can scope down
Per-resource, per-action scopes, a per-service allowlist, and a key can never create another key. Authentication
Twelve months' notice
Nothing gets removed or renamed without Deprecation/Sunset headers and
a one-year window. The policy
Built for agents
Every operation declares its scope, whether it’s destructive, and whether it’s asynchronous. Giving an agent access
VPS · DNS · managed databases · containers · load balancers · Object Storage · Mail Gateway · Image Services · serverless primitives · managed WordPress. 214 operations in total — the full reference.
WordPress, cPanel, domains, tickets, and billing arrive in v1.1. Anything
not in /v1/openapi.json has no
contract yet.