Every server Unmetered traffic, DDoS protection and IPMI included. No setup fees, no contract. Unmetered traffic on every server See pricing

API reference · v1

FlexDedi REST API

Every action of the control panel, available over HTTPS with JSON: order servers, reinstall, power-cycle, set reverse DNS and manage private VLANs and SSH keys.

  • https://api.flexdedi.com/v1
  • Bearer token
  • JSON over HTTPS

Quick reference

Base URL
https://api.flexdedi.com/v1
Authentication
Bearer token in the Authorization header
Format
JSON over HTTPS, ISO 8601 timestamps in UTC
Version
v1, breaking changes only in a new version
On this page

Overview

The FlexDedi API is a REST API. Requests and responses use JSON over HTTPS, timestamps are ISO 8601 in UTC, and every object has a prefixed string ID such as srv_7f3a for a server or key_2b81 for an SSH key. The current version is v1; breaking changes ship as a new version, never in place.

Authentication

Send your API key as a Bearer token in the Authorization header. Keys are either read-only or read-write, and you can revoke one at any time. Keep keys out of source code and shell history: read them from an environment variable or a secrets manager.

bash
curl -s https://api.flexdedi.com/v1/servers \
  -H "Authorization: Bearer $FLEXDEDI_TOKEN"

Requests and pagination

Send request bodies as JSON with Content-Type: application/json. List endpoints return a data array and a meta object; use page and per_page (default 25, maximum 100) to paginate.

List response
{
  "data": [
    { "id": "srv_7f3a", "plan": "pro-32", "location": "fra", "status": "active" }
  ],
  "meta": { "page": 1, "per_page": 25, "total": 1 }
}

Errors

Errors use standard HTTP status codes and a JSON body with a machine-readable code and a human-readable message.

StatusMeaning
400The request is malformed, for example invalid JSON.
401The API key is missing, invalid or revoked.
403The key is read-only, or the resource belongs to another account.
404The resource does not exist.
409The server is busy with another action, such as a reinstall.
422Validation failed, for example a plan that is not available in that location.
429Too many requests; retry after the delay in Retry-After.
5xxSomething failed on our side; retry with backoff.
Error response
{
  "error": {
    "code": "plan_unavailable",
    "message": "Plan max-192 is not available in location nyc."
  }
}

Rate limits

Each response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. When you exceed the limit, the API answers 429 with a Retry-After header in seconds. Poll long-running actions every 15 to 30 seconds rather than in a tight loop.

Plans

GET/plans

Lists the server configurations you can order, with their hardware, port speed, monthly price in USD and the locations where each is available.

json
{
  "data": [
    {
      "id": "pro-32",
      "name": "Pro 32",
      "cpu": "AMD EPYC 9355P",
      "cores": 32,
      "memory_gb": 384,
      "storage": "2 × 3.84 TB NVMe Gen5",
      "port": "25 Gbps",
      "price_monthly_usd": 749,
      "delivery": "minutes",
      "locations": ["nyc", "iad", "dfw", "lax", "ams", "fra", "lon", "sin"]
    }
  ]
}

Locations

GET/locations

Lists the data center locations with their code (nyc, iad, dfw, lax, ams, fra, lon, sin, tyo, syd), city, country and the plans available there.

OS images

GET/os-images

Lists installable images, such as ubuntu-24.04, debian-13, almalinux-9, rocky-9, proxmox-9 and windows-2025. Use the id when ordering or reinstalling.

Servers

GET/servers

Lists your servers. Filter with location, plan or status (provisioning, active, reinstalling, rescue, off).

POST/servers

Orders a server and starts provisioning. The response is the new server with status provisioning; poll it until the status is active. The order is billed like an order placed in the panel.

FieldTypeDescription
planstringRequired. A plan ID from GET /plans, for example pro-32.
locationstringRequired. A location code where the plan is available.
osstringRequired. An image ID from GET /os-images.
hostnamestringOptional. Set on the installed system.
ssh_keysarrayOptional. Names or IDs of saved SSH keys to install for root.
bash
curl -s -X POST https://api.flexdedi.com/v1/servers \
  -H "Authorization: Bearer $FLEXDEDI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"plan":"pro-32","location":"fra","os":"ubuntu-24.04","hostname":"db-1","ssh_keys":["ops-laptop"]}'
202 Accepted
{
  "id": "srv_9c4d",
  "plan": "pro-32",
  "location": "fra",
  "os": "ubuntu-24.04",
  "hostname": "db-1",
  "status": "provisioning",
  "ipv4": null,
  "ipv6": null,
  "created_at": "2026-11-02T14:05:31Z"
}

GET/servers/{id}

Returns one server with its status, plan, location, IPv4 address, IPv6 prefix and hostname.

PATCH/servers/{id}

Updates the label or hostname shown in the panel. It does not change the hostname inside a running operating system.

DELETE/servers/{id}

Cancels the server. It stays active until the end of the paid period, then its drives are wiped. Add ?immediately=true to stop and wipe it now; the current period is not refunded.

Power and reinstall

POST/servers/{id}/actions/{action}

Runs a power action through the management controller: reboot (ACPI restart), reset (hard reset), power-on, power-off or power-cycle. The response is the server with its updated status.

bash
curl -s -X POST https://api.flexdedi.com/v1/servers/srv_7f3a/actions/reboot \
  -H "Authorization: Bearer $FLEXDEDI_TOKEN"

POST/servers/{id}/actions/reinstall

Reinstalls the server with os, and optionally hostname and ssh_keys. This erases every drive. The status is reinstalling until the new system is ready.

bash
curl -s -X POST https://api.flexdedi.com/v1/servers/srv_7f3a/actions/reinstall \
  -H "Authorization: Bearer $FLEXDEDI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"os":"debian-13","hostname":"web-2","ssh_keys":["ops-laptop"]}'

POST/servers/{id}/actions/rescue

Boots the server into a rescue system loaded over the network, with your installed system left untouched on disk. Send {"enable": false} to leave rescue mode and boot from the drives again. See Reinstall and rescue.

IPs and reverse DNS

GET/servers/{id}/ips

Lists the IPv4 addresses and the IPv6 prefix assigned to a server, with their reverse DNS records.

PUT/servers/{id}/ips/{ip}/rdns

Sets the reverse DNS (PTR) record of an address with {"ptr": "mail.example.com"}. The forward record should resolve to the same address, especially for mail servers.

Private VLANs

GET/vlans

Lists your private networks with their location and VLAN ID. Private networks connect servers in the same location; internal traffic is not billed.

POST/vlans/{id}/servers

Attaches a server in the same location with {"server_id": "srv_7f3a"}. Then configure the VLAN interface in the operating system, as shown in Private networking.

SSH keys

GET/ssh-keys

Lists the public keys saved on your account.

POST/ssh-keys

Saves a public key with {"name": "ops-laptop", "public_key": "ssh-ed25519 AAAA…"} so you can reference it by name when ordering or reinstalling.

DELETE/ssh-keys/{id}

Deletes a saved key. Keys already installed on servers are not removed from them.

Bandwidth

GET/servers/{id}/bandwidth

Returns inbound and outbound traffic for a period set with from and to (ISO 8601), in 5-minute samples. Traffic is unmetered: these figures are for monitoring, not billing.

Terraform

The Terraform provider uses the same API key, read from the FLEXDEDI_TOKEN environment variable. A flexdedi_server resource maps to POST /servers; destroying it cancels the server.

main.tf
terraform {
  required_providers {
    flexdedi = { source = "flexdedi/flexdedi" }
  }
}

resource "flexdedi_server" "web" {
  plan     = "core-16"
  location = "ams"
  os       = "ubuntu-24.04"
  hostname = "web-1"
  ssh_keys = ["ops-laptop"]
}

output "web_ipv4" {
  value = flexdedi_server.web.ipv4
}