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.
# 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
# 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
- Create a key in your client area. The full key is shown exactly once.
- Send it with every request as
Authorization: Bearer ixk_...(an X-Api-Key header also works). - 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.
| Scope | Grants | Good for |
|---|---|---|
| read | Catalog, account, servers, jobs. Every key has it. | Dashboards, monitoring, price tooling |
| write | Power actions on your servers (start, stop, reboot) | Automation, watchdogs, scheduled restarts |
| deploy | Creating servers paid from your account credit | Provisioning 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.
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.
Every cloud provider we sell, with a region count. Use the id in the regions call.
curl https://api.initech.global/v1/providers
{
"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 },
...
]
}A provider's regions with the cheapest visible monthly plan price in each. from_price_monthly is null for build-your-own regions.
curl https://api.initech.global/v1/providers/7/regions
{
"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" },
...
]
}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).
curl https://api.initech.global/v1/regions/112
{
"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.
Your profile and current credit balance. Deploys draw from credit; top up on the Add Funds page (crypto accepted).
{ "id": 1234, "first_name": "Ada", "last_name": "L",
"company": "", "email": "ada@example.com", "country": "DE",
"credit": "42.50", "created_at": "2025-11-02" }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.
{ "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 }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.
{ "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" }
] }One server plus its full configuration: the chosen plan, OS and add-ons. Toggle add-ons show enabled, quantity add-ons show quantity.
{ ...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.
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.
curl -X POST \ -H "Authorization: Bearer $IX_KEY" \ https://api.initech.global/v1/services/1204/actions/reboot
{ "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 }| Status | Meaning |
|---|---|
| 202 | Job enqueued; poll /v1/jobs/{id} |
| 409 | Service not active, or an action is already pending (the response includes the pending job_id) |
| 422 | Actions are not supported for this service's provider |
| 429 | Too many pending jobs (max 5 per account) |
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).
| Body field | Type | Notes |
|---|---|---|
| region_id | int | Required. A region id from the catalog |
| plan | int | string | Required. Plan sub_id or key, e.g. "cpx22" |
| os | int | string | Required. OS sub_id or key, e.g. "ubuntu-24.04" |
| billing_cycle | string | Optional, default monthly. One of monthly, quarterly, semiannually, annually, biennially, triennially |
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"}'
{ "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:
| Account | Deploys per 24h | Notes |
|---|---|---|
| New (under 30 days or under $20 lifetime) | 2 | Also 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.
| Status | Meaning |
|---|---|
| 202 | Deploy job enqueued |
| 200 | Idempotency-Key replay; the original job is returned |
| 402 | Insufficient credit (the message states required vs available) |
| 403 | Key lacks the deploy scope, or deploys are unavailable for this account |
| 422 | Unknown region, plan or OS, or region not deployable via the API |
| 429 | Velocity limit reached |
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.
/v1/jobs lists your recent jobs newest first (limit 1 to 100, default 25); /v1/jobs/{id} returns one.
| Job status | Meaning |
|---|---|
| queued | Waiting for the worker; typically under a minute |
| running | Being executed at the provider |
| completed | Done; result is populated |
| failed | Did not complete; error.code and a human message are set |
| error.code | Meaning | What to do |
|---|---|---|
| service_not_active | The server is not in Active status | Check the service; suspended servers cannot be managed via the API |
| not_ready | The server is still provisioning | Retry in a few minutes |
| provider_error | The provider rejected or failed the operation after retries | Try again; contact support if it persists |
| order_failed | A deploy could not be started or paid | You were not charged; check credit and re-submit |
| interrupted | The job was interrupted mid-flight | Re-submit; contact support if it repeats |
| unsupported_provider | This provider has no API actions yet | Manage it from the client area |
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).
| HTTP | Meaning |
|---|---|
| 400 | Malformed request (invalid JSON, missing required fields, bad parameter) |
| 401 | Missing, invalid or revoked API key |
| 402 | Insufficient account credit for a deploy |
| 403 | Key lacks the required scope, or the account cannot use this feature |
| 404 | Unknown route or resource (including resources you do not own) |
| 405 | Wrong HTTP method; the Allow header lists valid ones |
| 409 | Conflict: service not active, or an action is already pending |
| 415 | POST body must be application/json |
| 422 | Understood but not fulfillable (unknown plan, unsupported provider) |
| 429 | Rate or velocity limit; Retry-After tells you when to come back |
| 500 | Our fault; nothing was charged, try again |
| Public endpoints | 30 requests per minute per IP |
| Authenticated endpoints | 120 requests per minute per key |
| Headers | Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (unix time) |
| Over the limit | HTTP 429 with a Retry-After header |
| Queue caps | Max 5 pending jobs per account, 2 pending deploys, one action per server at a time |
| Prices | USD strings with two decimals; each billing cycle shows the total per term |
| 2026-08-15 | Power actions (start, stop, reboot), deploys from credit, jobs, key scopes |
| 2026-08-14 | Initial release: catalog, account, servers, API keys, OpenAPI spec |
On the roadmap: OS reinstall, plan resize, and more deployable providers.