Getting started

From nothing to a running server, in the order you will actually do it. Every call here is real - copy them as they are and substitute your own token.

1. Issue a token

Open API tokens in your client area, pick the project you want to manage, and choose an access level. Take read first if you only want to look around; you can issue a second token with write access when you are ready to create things.

The secret is shown once. We keep only its fingerprint, so a lost token is replaced, not recovered.

2. Make sure it works

curl -H "Authorization: Bearer $FBX_TOKEN" \
     https://api.fiberax.com/v1/project

You should get your project back:

{ "data": { "id": 1201, "name": "My Data Center", "status": "Active" } }

If this returns 401, the token is wrong or revoked. If it returns 403, the token is fine but its access level is lower than the call needs.

3. Look at what you can create

Server types differ in how they are sized, and that changes what the create call must carry. Read them first:

curl -H "Authorization: Bearer $FBX_TOKEN" \
     https://api.fiberax.com/v1/server-types

There are three ways a type can be sized, and the mode says which one applies. A type with "pricing_mode": "plans" is bought by the plan - you send plan_id and must not send cores, memory_mb or disk_gb. A type with "pricing_mode": "sliders" is the other way round: the three numbers, no plan. A type with "pricing_mode": "fixed" is bought as a ready package - one field, gpu_package, and the size fields are refused next to it (see GPU servers). Sending the wrong set is refused with 422 rather than quietly interpreted.

Then list the images that type offers, and the prices:

curl -H "Authorization: Bearer $FBX_TOKEN" \
     "https://api.fiberax.com/v1/server-types/4/images"

curl -H "Authorization: Bearer $FBX_TOKEN" \
     "https://api.fiberax.com/v1/server-types/4/pricing"

The image list also contains your own uploaded ISO images, marked "type": "useriso" and identified as uiso-N. A server cannot be created from one of those - the request is refused with image_not_supported. An ISO installs a machine rather than builds one: create the server from an operating system image and insert the ISO into its drive afterwards.

4. Add your SSH key

Keys live in your account pool, so this is done once and every project sees them:

curl -X POST -H "Authorization: Bearer $FBX_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"name":"laptop","public_key":"ssh-ed25519 AAAA... you@laptop"}' \
     https://api.fiberax.com/v1/ssh-keys

5. Create a server

On a slider type, with a fresh public address and your key:

curl -X POST -H "Authorization: Bearer $FBX_TOKEN" \
     -H "Content-Type: application/json" \
     -H "Idempotency-Key: first-server-2026-08-19" \
     -d '{
       "name": "web-01",
       "server_type_id": 4,
       "image": "fcf9f69c8630904c1d6d73a821f4e674",
       "cores": 2,
       "memory_mb": 4096,
       "disk_gb": 40,
       "public_ipv4": { "new": true },
       "ssh_keys": [13]
     }' \
     https://api.fiberax.com/v1/servers

The answer comes back before the server is ready:

{
  "data": { "id": 10871, "name": "web-01", "status": "creating", ... },
  "task": { "id": "8f3c...", "status": "pending", "is_terminal": false,
            "poll": "/v1/tasks/8f3c..." }
}

You already have the identifier - use it. The Idempotency-Key above matters: if the connection drops and you repeat the call with the same key, you get the same server back instead of a second one you did not want.

A refusal is remembered under that key too, for a day. So if the request was wrong and you fix it, send a NEW key: repeating with the old one returns the stored refusal, and a changed body under the old key is rejected outright as idempotency_key_reused (422).

6. Wait for it

curl -H "Authorization: Bearer $FBX_TOKEN" \
     https://api.fiberax.com/v1/tasks/8f3c...

Poll until is_terminal is true. Then read the server itself - the task tells you the work finished, the resource tells you what it finished as.

7. Describe it with Terraform or OpenTofu

Everything above is also available as a Terraform provider, fiberax/fiberax: servers, SSH keys, public addresses, private networks, disks, network cards, the server firewall and backup policies, plus data sources for server types, images and prices.

The provider is in a trial period and is not in the public registry yet. It is served from our own mirror, and Terraform installs it from there once you tell it where to look. Put this into ~/.terraformrc (on Windows: %APPDATA%\terraform.rc):

provider_installation {
  network_mirror {
    url     = "https://docs.fiberax.com/terraform/mirror/"
    include = ["registry.terraform.io/fiberax/*"]
  }
  direct {
    exclude = ["registry.terraform.io/fiberax/*"]
  }
}

For OpenTofu the file is ~/.tofurc and the registry name is its own:

provider_installation {
  network_mirror {
    url     = "https://docs.fiberax.com/terraform/mirror/"
    include = ["registry.opentofu.org/fiberax/*"]
  }
  direct {
    exclude = ["registry.opentofu.org/fiberax/*"]
  }
}

Three things about these lines. The trailing slash in url is required: without it Terraform does not complain about the file, it says the provider "was not found in any of the search locations", as if it did not exist. include keeps the mirror to our provider only; without it every other provider you use would be looked for on our mirror as well. The exclude under direct is optional, but with it a mirror outage is reported as "not found" instead of a confusing message from the public registry.

Then reference the provider as usual. The token is the same one as above; the provider reads it from FIBERAX_TOKEN if you leave token out:

terraform {
  required_providers {
    fiberax = {
      source  = "fiberax/fiberax"
      version = "0.3.0"
    }
  }
}

provider "fiberax" {}

resource "fiberax_server" "web" {
  name           = "web-01"
  server_type_id = 4
  image          = "fcf9f69c8630904c1d6d73a821f4e674"
  cores          = 2
  memory_mb      = 4096
  disk_gb        = 40
  ssh_keys       = [13]

  public_ipv4 = { new = true }
}

terraform init should end with Installed fiberax/fiberax v0.3.0 (verified checksum). It will also print a yellow warning, Incomplete lock file information for providers: that is how Terraform behaves with any provider that does not come from the registry, not a fault of the mirror. It matters only when the lock file is shared between machines with different operating systems - then record every platform you use once:

terraform providers lock -net-mirror=https://docs.fiberax.com/terraform/mirror/ \
    -platform=linux_amd64 -platform=darwin_arm64 -platform=windows_amd64

When the provider reaches the public registry, you delete the provider_installation block and change nothing else: the source address in your configuration is already the final one. Every resource and data source, with its fields, examples and import syntax, is in the provider reference. Tell us about anything that behaves differently from what you expected - that is what the trial is for.

8. Where to go next

Two habits worth forming early

Send an idempotency key on everything that creates or charges. Servers and public addresses cost money; a retry without a key can buy you two of them.

Branch on code, not on text. The title of an error is written for a human and may be reworded. The code is part of the contract.

Something here not matching what you see? Quote the X-Request-Id of the call when you write to us - it is how we find it.