Initech

Initech API

The full multi-cloud catalog with live pricing, your servers and balance, power actions, and one-call deploys paid from account credit. JSON over HTTPS, no SDK required.

Base URL https://api.initech.global
Quickstart
Public: browse the catalogcurl
# All providers
curl https://api.initech.global/v1/providers

# Regions and starting prices
curl https://api.initech.global/v1/providers/2/regions

# Plans, OS images, add-ons
curl https://api.initech.global/v1/regions/13
Authenticated: your accountcurl
# Create a key first (Authentication below)
export IX_KEY=ixk_...

curl -H "Authorization: Bearer $IX_KEY" \
  https://api.initech.global/v1/services

# Reboot a server (key needs the write scope)
curl -X POST \
  -H "Authorization: Bearer $IX_KEY" \
  https://api.initech.global/v1/services/123/actions/reboot
Authentication
  1. Create a key in your client area. The full key is shown exactly once.
  2. Send it with every request as Authorization: Bearer ixk_... (an X-Api-Key header also works).
  3. Every key can read. Add the write scope (power actions) or the deploy scope (spends credit) only where needed. Keys can be revoked at any time; up to 5 active keys per account.
ScopeGrantsGood for
readCatalog, account, servers, jobs. Every key has it.Dashboards, monitoring, price tooling
writePower actions on your servers (start, stop, reboot)Automation, watchdogs, scheduled restarts
deployCreating servers paid from your account creditProvisioning pipelines, infrastructure-as-code

Keys are stored hashed on our side and are never recoverable after creation. A revoked key stops working immediately. Failed authentications count against your IP's rate limit.

Manage your API keys

Concepts

Three ids describe everything sellable: a provider (Vultr, Hetzner, ...), a region (one city, e.g. Nuremberg), and within a region its plans, OS images and add-ons. Walk them in that order: /v1/providers gives provider ids, /v1/providers/{id}/regions gives region ids, /v1/regions/{id} gives everything deployable there. Plans and OS images carry both a numeric sub_id and a provider-native key (like cpx22 or ubuntu-24.04); either identifies them in a deploy.

Money is always a USD string with two decimals. Prices are totals per billing term, not per month: a plan showing "annually": "182.40" costs that once per year. Timestamps are UTC. The API is versioned in the path; breaking changes would ship as /v2, and /v1 stays stable.

Catalog (public)
GET/v1/providerspublic

Every cloud provider we sell, with a region count. Use the id in the regions call.

Requestcurl
curl https://api.initech.global/v1/providers
Response 200json
{
  "providers": [
    { "id": 2, "name": "Vultr - Linux VPS",
      "slug": "vultr-linux-vps", "regions": 32 },
    { "id": 7, "name": "Hetzner Cloud - Linux VPS",
      "slug": "hetzner-cloud-linux-vps", "regions": 5 },
    ...
  ]
}
GET/v1/providers/{id}/regionspublic

A provider's regions with the cheapest visible monthly plan price in each. from_price_monthly is null for build-your-own regions.

Requestcurl
curl https://api.initech.global/v1/providers/7/regions
Response 200json
{
  "provider": { "id": 7,
    "name": "Hetzner Cloud - Linux VPS",
    "slug": "hetzner-cloud-linux-vps" },
  "regions": [
    { "id": 116, "name": "Virginia - United States",
      "slug": "virginia-united-states",
      "from_price_monthly": "9.00" },
    { "id": 112, "name": "Nuremberg - Germany",
      "slug": "nuremberg-germany",
      "from_price_monthly": "19.00" },
    ...
  ]
}
GET/v1/regions/{id}public

The full catalog for one region: plans, OS images and add-ons, each with prices for all six billing cycles. Add-ons come in three types: toggle (on/off, priced flat), quantity (per unit, with qty_min/qty_max), and dropdown (pick one entry).

Requestcurl
curl https://api.initech.global/v1/regions/112
Response 200 (trimmed)json
{
  "id": 112,
  "provider": { "id": 7, "name": "Hetzner Cloud - Linux VPS" },
  "name": "Nuremberg - Germany",
  "currency": "USD",
  "plans": [
    { "option_id": 107, "sub_id": 3500, "key": "cpx22",
      "label": "CPX 22 - RAM: 4GB - AMD vCPU: 2 - ...",
      "prices": { "monthly": "19.00", "quarterly": "57.00",
        "annually": "182.40", ... } }
  ],
  "os": [
    { "option_id": 106, "sub_id": 3919, "key": "ubuntu-24.04",
      "label": "Ubuntu 24.04", "prices": { "monthly": "0.00", ... } }
  ],
  "addons": [
    { "key": "volume", "type": "quantity", "unit": "GB",
      "qty_min": 0, "qty_max": 2048,
      "unit_prices": { "monthly": "0.13", ... } },
    { "key": "backups", "type": "toggle",
      "prices": { "monthly": "20.00", ... } }
  ]
}

404 for unknown or retired regions. The key values here are exactly what POST /v1/servers accepts.

Account
GET/v1/accountread

Your profile and current credit balance. Deploys draw from credit; top up on the Add Funds page (crypto accepted).

Response 200json
{ "id": 1234, "first_name": "Ada", "last_name": "L",
  "company": "", "email": "ada@example.com", "country": "DE",
  "credit": "42.50", "created_at": "2025-11-02" }
GET/v1/account/credit-historyread

Your credit ledger, newest first. Positive amounts are credit added, negative amounts are credit spent. Query params: limit (1 to 100, default 25) and offset.

Response 200json
{ "entries": [
    { "date": "2026-08-12", "description": "Add Funds Invoice #18120",
      "amount": "50.00" },
    { "date": "2026-08-14", "description": "Credit Applied to Invoice #18150",
      "amount": "-19.00" }
  ], "limit": 25, "offset": 0 }
Servers
GET/v1/servicesread

Your servers with provider, region, IPs, billing cycle and renewal date. By default only pending, active and suspended services are returned; pass ?status=all to include history. hostname is the provider label and is not guaranteed to be a resolvable name.

Response 200json
{ "services": [
    { "id": 1204, "status": "Active",
      "provider": { "id": 7, "name": "Hetzner Cloud - Linux VPS" },
      "region": { "id": 112, "name": "Nuremberg - Germany" },
      "hostname": "web-01", "ipv4": "203.0.113.10",
      "ipv6": "2a01:4f8:aaaa::/64",
      "billing_cycle": "Monthly", "recurring_amount": "19.00",
      "next_due_date": "2026-09-01", "registration_date": "2026-01-15" }
  ] }
GET/v1/services/{id}read

One server plus its full configuration: the chosen plan, OS and add-ons. Toggle add-ons show enabled, quantity add-ons show quantity.

Response 200 (configuration excerpt)json
{ ...service fields as above...
  "configuration": [
    { "option": "Type", "key": "cpx22",
      "label": "CPX 22 - RAM: 4GB - AMD vCPU: 2 - ..." },
    { "option": "Image", "key": "ubuntu-24.04", "label": "Ubuntu 24.04" },
    { "option": "Enable Backups", "key": "backups", "enabled": false },
    { "option": "Additional Volume Size [GB]", "key": "volume",
      "quantity": 0 }
  ] }

A service id you do not own returns 404, identical to a nonexistent one.

Power actions

Actions are asynchronous: the API answers immediately with a job, and a worker executes the action at the provider, normally within a minute. Supported for Vultr, Hetzner, DigitalOcean and Amazon Lightsail servers in Active status. One action per server can be pending at a time. stop is a hard power-off; data on disk is unaffected, billing continues while a server is stopped.

POST/v1/services/{id}/actions/{start|stop|reboot}write
Requestcurl
curl -X POST \
  -H "Authorization: Bearer $IX_KEY" \
  https://api.initech.global/v1/services/1204/actions/reboot
Response 202json
{ "id": 88, "type": "server.reboot", "status": "queued",
  "service_id": 1204, "created_at": "2026-08-15 09:12:00",
  "finished_at": null, "result": null, "error": null }
StatusMeaning
202Job enqueued; poll /v1/jobs/{id}
409Service not active, or an action is already pending (the response includes the pending job_id)
422Actions are not supported for this service's provider
429Too many pending jobs (max 5 per account)
Deploys

Deploy new servers in Vultr, Hetzner and DigitalOcean regions, paid from your account credit. The first invoice must be fully covered by credit; there is no partial payment. You are never charged for a failed deploy. The response is a job; when it completes, result carries the new service_id, status and IPv4 (for Vultr the IP can arrive a few minutes after the server, so a null ipv4 just means check /v1/services/{id} shortly after).

POST/v1/serversdeploy
Body fieldTypeNotes
region_idintRequired. A region id from the catalog
planint | stringRequired. Plan sub_id or key, e.g. "cpx22"
osint | stringRequired. OS sub_id or key, e.g. "ubuntu-24.04"
billing_cyclestringOptional, default monthly. One of monthly, quarterly, semiannually, annually, biennially, triennially
Requestcurl
curl -X POST https://api.initech.global/v1/servers \
  -H "Authorization: Bearer $IX_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: deploy-web-02" \
  -d '{"region_id": 112, "plan": "cpx22",
       "os": "ubuntu-24.04"}'
Completed job (via /v1/jobs/{id})json
{ "id": 91, "type": "deploy", "status": "completed",
  "service_id": 1288,
  "created_at": "2026-08-15 09:14:02",
  "finished_at": "2026-08-15 09:14:41",
  "result": { "service_id": 1288, "status": "Active",
              "ipv4": "178.156.244.211" },
  "error": null }

Idempotency. Send an Idempotency-Key header (up to 64 characters, unique per intended deploy). If a network retry re-sends the same request, the API returns the original job with status 200 instead of ordering twice. Strongly recommended for any automation.

Velocity limits. Deploy allowances grow with account history and are applied automatically:

AccountDeploys per 24hNotes
New (under 30 days or under $20 lifetime)2Also capped at 5 active API-created servers
Established (30+ days, $20+ paid, clean record)10
Veteran (180+ days, $250+ paid)30

Need more? Open a ticket; limits are raised per account. Deploys are unavailable while an account has recent abuse enforcement on record.

StatusMeaning
202Deploy job enqueued
200Idempotency-Key replay; the original job is returned
402Insufficient credit (the message states required vs available)
403Key lacks the deploy scope, or deploys are unavailable for this account
422Unknown region, plan or OS, or region not deployable via the API
429Velocity limit reached
Jobs

Every action and deploy returns a job. Poll it until status is completed or failed; once a minute is plenty. Jobs are kept permanently as your audit trail.

GET/v1/jobs  ·  /v1/jobs/{id}read

/v1/jobs lists your recent jobs newest first (limit 1 to 100, default 25); /v1/jobs/{id} returns one.

Job statusMeaning
queuedWaiting for the worker; typically under a minute
runningBeing executed at the provider
completedDone; result is populated
failedDid not complete; error.code and a human message are set
error.codeMeaningWhat to do
service_not_activeThe server is not in Active statusCheck the service; suspended servers cannot be managed via the API
not_readyThe server is still provisioningRetry in a few minutes
provider_errorThe provider rejected or failed the operation after retriesTry again; contact support if it persists
order_failedA deploy could not be started or paidYou were not charged; check credit and re-submit
interruptedThe job was interrupted mid-flightRe-submit; contact support if it repeats
unsupported_providerThis provider has no API actions yetManage it from the client area
Errors

Errors are always {"error": "message"} with a meaningful HTTP status. Messages are stable enough to display but not to parse; branch on the status code (and error.code inside failed jobs).

HTTPMeaning
400Malformed request (invalid JSON, missing required fields, bad parameter)
401Missing, invalid or revoked API key
402Insufficient account credit for a deploy
403Key lacks the required scope, or the account cannot use this feature
404Unknown route or resource (including resources you do not own)
405Wrong HTTP method; the Allow header lists valid ones
409Conflict: service not active, or an action is already pending
415POST body must be application/json
422Understood but not fulfillable (unknown plan, unsupported provider)
429Rate or velocity limit; Retry-After tells you when to come back
500Our fault; nothing was charged, try again
Rate limits and conventions
Public endpoints30 requests per minute per IP
Authenticated endpoints120 requests per minute per key
HeadersEvery response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (unix time)
Over the limitHTTP 429 with a Retry-After header
Queue capsMax 5 pending jobs per account, 2 pending deploys, one action per server at a time
PricesUSD strings with two decimals; each billing cycle shows the total per term
Changelog
2026-08-15Power actions (start, stop, reboot), deploys from credit, jobs, key scopes
2026-08-14Initial release: catalog, account, servers, API keys, OpenAPI spec

On the roadmap: OS reinstall, plan resize, and more deployable providers.

Questions or a use case we should support? Open a ticket · openapi.json