Documentation · Review-ready MVP

From access request to
your first API call.

SJJ Cloud is an orchestration layer for VPS providers. Keep your own provider accounts and use one API to provision, operate, and automate them.

Important: The production API base URL is https://api.sjjcloud.com. Account, access, billing, and webhook routes live under /api/*. The provider endpoint shapes below are also available as /v1/* aliases and currently return explicitly marked mock data until real provider adapters are connected. Your account ID, limits, and provider adapter availability are confirmed in the approval email.
THE CUSTOMER JOURNEY

One clear path to a live workspace.

Every paid account follows the same five stages. This makes access, billing, and API delivery easy to understand.

01RequestApplication form 02ReviewHuman approval 03CheckoutStripe subscription 04ActivateWorkspace enabled 05API keyDelivered once
QUICKSTART

Register, review, pay, connect.

Use this sequence to prepare a customer-facing integration or to test the workflow manually.

01

Request access

Submit your intended use, estimated fleet size, and the providers you already use. Do not send provider secrets in the application form.

POST /v1/access-requests
{
  "email": "[email protected]",
  "company": "Example Studio",
  "use_case": "multi-provider deployment",
  "expected_instances": 50,
  "providers": ["hetzner", "dmit"]
}
02

Wait for manual review

We verify the use case and send a decision email. The request is read-only until approved.

pending_reviewapprovedneeds_info
03

Open Stripe Checkout

Approved applicants receive a one-time Checkout link for the $199/month Core Plan. The plan renews monthly until cancelled from the billing portal. The deployed MVP route is shown below; the versioned /v1/* contract remains planned.

POST /api/billing/checkout
Content-Type: application/json

{ "access_request_id": "...", "status_token": "..." }

// response
{ "checkout_url": "https://checkout.stripe.com/...", "session_id": "cs_..." }
04

Activate the workspace

After Stripe confirms payment, the workspace moves to active. The customer can manage subscription status, payment methods, invoices, and cancellation in the billing portal.

GET /v1/account
// response
{ "status": "active", "plan": "core", "renewal_date": "2026-10-04" }
05

Receive an API key

A secret key is sent to the verified account email and is only stored as a hash by the Worker. The customer account UI can display masked key metadata; provider scopes and key rotation are planned follow-ups.

// email delivery after checkout.session.completed
{ "key_prefix": "sjj_xxxxxxxx", "created_at": "" }

// planned versioned route
POST /v1/keys
API REFERENCE

One contract for every provider.

All requests use JSON and the Authorization: Bearer <API_KEY> header. Provider-specific differences are normalized by the adapter layer.

POST/v1/providers/{provider}/credentials

Connect a provider API key

In the MVP simulation, the credential is stored as a protected hash with only its last four characters retained. Real provider calls and encrypted credential storage will be added with the adapter layer.

{
  "api_key": "provider-secret",
  "label": "production-eu"
}

Never put provider keys in browser code, URLs, screenshots, or support tickets.

POST/v1/instances

Provision a VPS resource

Choose a provider and the portable fields below. Unsupported options return a clear 422 response with the provider capability matrix.

{
  "provider": "hetzner",
  "region": "fsn1",
  "plan": "cx22",
  "bandwidth_gb": 20,
  "image": "ubuntu-24.04",
  "name": "worker-01"
}
regioninstance planbandwidthoperating system
GET/v1/providers/{provider}/instances

List resources by provider

Keep provider boundaries visible while using one normalized schema.

?status=running&region=fsn1&limit=100

// response
{ "provider": "hetzner", "items": [
  { "id": "i_123", "name": "worker-01", "status": "running", "ipv4": "203.0.113.10" }
] }
POST/v1/commands/batch

Dispatch Linux commands in bulk

Target a saved inventory query or explicit instance IDs. Commands run through the provider connection and return per-host results.

{
  "instance_ids": ["i_123", "i_456"],
  "command": "sudo apt-get update -y",
  "timeout_seconds": 60,
  "continue_on_error": true
}
BETA/v1/workflows

Compose repeatable workflows In development

Workflows will organize multiple steps—provision, wait for readiness, install packages, run a command, and notify your team—into one auditable run.

{
  "name": "bootstrap-web-tier",
  "steps": [
    { "action": "provision", "provider": "hetzner", "plan": "cx22" },
    { "action": "wait_for_ssh", "timeout_seconds": 180 },
    { "action": "run_command", "command": "./install-nginx.sh" }
  ]
}
AI/v1/ai/schema

AI-agent friendly by design

Every endpoint can expose machine-readable JSON Schema and concise tool metadata. Agents can discover required fields, call the same REST API, and parse consistent success/error envelopes.

GET /v1/ai/schema?resource=instances
Accept: application/json

// tool metadata includes name, description,
// input_schema, output_schema, auth_scopes
JSON Schemastable tool namesidempotency keysstructured errors
REFERENCE ARCHITECTURE

Secrets stay in your workspace.

Credentials are stored server-side. Your application talks to SJJ Cloud; SJJ Cloud talks to each provider adapter.

Your app / AI agentBearer API keyJSON + schemas SJJ Cloud APIAuth + quotasNormalized contractEncrypted credentials Provider AProvider BProvider …
FOR AI AGENTS

Predictable inputs. Useful outputs.

Agents should not need provider-specific knowledge. Use the schema endpoint to generate tools, then pass an idempotency key for safe retries.

{ }

Discover

Fetch JSON Schema and tool metadata for each operation.

Execute

Call REST endpoints with normal auth and idempotency headers.

Verify

Parse the same structured envelope for success, partial results, or errors.

NEED ACCESS?

Tell us what you are building.

Share your use case and expected scale. We will reply with review status and next steps.

Email support ↗