OpenMetal API (1.0.0)

Download OpenAPI specification:Download

Authentication

Most API endpoints are secured using Bearer Token Authentication. To access the API, you need to include a valid token in the Authorization header of your requests.

Example:

Authorization: Bearer <your-token>

Generating Tokens

There are two methods to obtain Bearer tokens for API authentication:

1. API Keys

API Keys are long-term tokens that provide persistent access to the API.

  • Generation: API Keys can be generated via OpenMetal Central
    • Navigate to Organization Dashboard → Organization Tools → API Keys
    • Create a new API key and securely store the generated token
  • Usage: Use the API key directly as a Bearer token in the Authorization header

2. OAuth 2.0 Clients

OAuth Applications provide short-lived tokens using client credentials.

  • Generation: OAuth Apps can be created via OpenMetal Central
    • Navigate to Organization Dashboard → Organization Tools → API Keys
    • Create a new OAuth Client
    • You will receive a client_id and client_secret
  • Token Exchange: Use your OAuth credentials to obtain a Bearer token via the /v1/oauth2/token endpoint (see below)

Security Notes

  • Keep all tokens and credentials secure and never share them publicly
  • API Keys should be rotated periodically
  • OAuth tokens have limited lifespans and should be refreshed as needed
  • Unauthorized requests will result in a 401 Unauthorized response

If you have trouble authenticating or accessing the API, please contact support@openmetal.io for assistance.

OAuth 2.0

Operations for OAuth 2.0 client credential flow and token management.

Get Token

Exchange OAuth Application client credentials for a short-lived Bearer token.

This endpoint uses Basic Authentication with your OAuth App credentials:

  • Username: client_id
  • Password: client_secret

The Authorization header should contain the Base64-encoded credentials in the format:

Authorization: Basic <Base64(client_id:client_secret)>

Example cURL request:

curl --location 'https://api.central.openmetal.io/v1/oauth2/token?grant_type=client_credentials' \
  --header 'Authorization: Basic <Base64-encoded-credentials>'
Authorizations:
basicAuth
query Parameters
grant_type
required
string
Value: "client_credentials"
Example: grant_type=client_credentials

The OAuth grant type. Currently only "client_credentials" is supported.

Responses

Response samples

Content type
application/json
{}

Clouds

Operations for managing a collection of servers. Private clouds or a group of baremetal nodes will be owned by a cloud resource.

Get a list of clouds

Retrieve a list of of your clouds.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a cloud by ID

Retrieve details of a specific cloud by their ID.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string

The ID of the cloud to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": "0Absd1",
  • "label": "My first cloud",
  • "description": "This cloud is for testing purposes.",
  • "created_at": "2021-01-01T00:00:00Z",
  • "fields": {
    }
}

Delete a cloud

Delete a cloud resource and reclaim all associated infrastructure. If a cloud is > 60 minutes old, a deletion request will generate a confirmation code that is sent to the account owner's email for verification. This code must be provided as a query parameter to complete the deletion.

Important: The cloud will be immediately deactivated upon successful deletion. However, there is a 3-day delay before servers are fully decommissioned and wiped. Clouds will enter a "pending-delete" state during this period.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string
Example: 0Absd1

The ID of the cloud to delete.

query Parameters
code
string
Example: code=123456

Email confirmation code (required when delete_method is "email-2fa"). If not provided and email-2fa is required, a confirmation code will be sent to the account owner's email.

Responses

Response samples

Content type
application/json
Example

A confirmation code has been sent to the account owner's email. Retry the request with the code parameter.

{
  • "errors": [
    ]
}

Get hardware information

Get hardware information for a specific cloud. This includes current power state of all nodes.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string

The ID of the cloud to retrieve.

Responses

Response samples

Content type
application/json
{
  • "cloud_state": "RUNNING",
  • "cloud_uuid": "0000000-0000-00-00000",
  • "nodes": [
    ]
}

Assign a VLAN to a cloud

Assign an existing VLAN resource to a private cloud.

Requirements:

  • Both the cloud and VLAN must be in the same datacenter location
  • Both resources must be owned by the same organization
  • The cloud provisioning status must be "complete"
  • Clouds can have a maximum of 10 assigned VLANs
Authorizations:
bearerAuth
path Parameters
cloudId
required
string
Example: 0Absd1

The ID of the cloud to assign the VLAN to.

vlanId
required
string
Example: vl4nXy2Z9a

The ID of the VLAN resource to assign.

Responses

Response samples

Content type
application/json
{
  • "id": "vl4nXy2Z9a",
  • "type": "vlans",
  • "label": "production-vlan",
  • "description": "VLAN for production workloads",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Unassign a VLAN from a cloud

Unassign a VLAN resource from a private cloud.

This removes the association between the VLAN and the cloud but does not delete the VLAN resource itself.

Important: You cannot remove all VLAN assignments. A VLAN needs to have at least one cloud assignment.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string
Example: 0Absd1

The ID of the cloud to unassign the VLAN from.

vlanId
required
string
Example: vl4nXy2Z9a

The ID of the VLAN resource to unassign.

Responses

Nodes

Operations for managing and interacting with individual nodes that are assigned to a cloud, including IPMI console access and power management.

Change the power state of the node.

Change power state. Options are "power on", "power off", or "rebooting".

Authorizations:
bearerAuth
path Parameters
cloudId
required
string

The ID of the cloud that owns the node.

nodeUuid
required
string

The UUID of the node to change the power state. This UUID can be found in the cloud hardware information.

Request Body schema: application/json
required
power_state
string

The new power state of the node. Options are "power on", "power off", or "rebooting".

Responses

Request samples

Content type
application/json
{
  • "power_state": "power on"
}

Response samples

Content type
application/json
{
  • "result": "success",
  • "power_state": "power on",
  • "node_uuid": "0000000-0000-00-00000"
}

Generate IPMI Session via HTML5

Generates an IPMI (Intelligent Platform Management Interface) console session and retrieves a URL for accessing the HTML5-based web console for remote management of a node. This provides browser-based KVM access for server remote management without requiring Java or additional software installation.

Recommended Method: The HTML5 console is the recommended method for accessing IPMI as it works directly in modern web browsers.

For help using the web console, see Accessing IPMI on Central Dashboard.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string
Example: 0Absd1

The ID of the cloud that owns the node.

inventoryUuid
required
string <uuid>
Example: 0000000-0000-00-00000

UUID v4 string identifying the inventory item (node). This can be found in the cloud hardware information.

Responses

Response samples

Content type
application/json
{
  • "url": "https://<Node UUID>.ipmi.pod-4.flexmetal.net:<PORT>/redfish/<SESSION-ID>.IKVM"
}

Generate IPMI Session via JNLP

Generates an IPMI (Intelligent Platform Management Interface) console session and downloads a Java Network Launch Protocol (JNLP) file for launching a Java-based KVM console to access a node's remote management interface.

Prerequisites:

  • Java Runtime Environment (JRE) must be installed on the client machine
  • Download available from www.java.com/en/download

Usage: Once downloaded, the JNLP file can be launched with Java Web Start to open the KVM console.

For additional assistance, visit the IPMI KVM documentation.

Authorizations:
bearerAuth
path Parameters
cloudId
required
string
Example: 0Absd1

The ID of the cloud that owns the node.

inventoryUuid
required
string <uuid>
Example: 0000000-0000-00-00000

UUID v4 string identifying the inventory item (node). This can be found in the cloud hardware information.

Responses

Deployment

Operations for deployment and provisioning related resources such as node images.

Get operating system images for a pod location

Retrieve a list of available operating system images for node deployment at a specific pod location. This endpoint does not require authentication.

path Parameters
pod_location
required
string (PodLocations)
Enum: "pod_1" "pod_2" "pod_3" "pod_5"
Example: pod_1

The unique datacenter identifier (e.g., "pod_1", "pod_2", etc.). Available locations can be retrieved from the inventory locations endpoint.

Responses

Response samples

Content type
application/json
{}

Inventory

Operations for retrieving inventory information such as available locations and availability.

Get available locations

Retrieve a list of available datacenter locations and their details.

Responses

Response samples

Content type
application/json
{
  • "locations": {
    }
}

Get inventory availability for a specific pod location

Retrieve current inventory availability information for a specific datacenter location. This endpoint shows available hardware SKUs and their counts.

path Parameters
pod_location
required
string
Example: pod_1

The unique datacenter identifier (e.g., "pod_1", "pod_2", etc.). Available locations can be retrieved from the inventory locations endpoint.

Responses

Response samples

Content type
application/json
{
  • "medium_v4": {
    },
  • "large_v4": {
    },
  • "timestamp": "2025-08-29T13:05:27+00:00",
  • "pod_location": "pod_1"
}

Get product catalog

Retrieve a catalog of available OpenMetal cloud products including hardware configurations and addon services.

This is a public endpoint that provides the complete product catalog, including:

  • Hardware products grouped by type (Small, Medium, Large, etc.)
  • Addon services categorized by functionality (memory, storage, ip_block, other)
  • Pricing information for all products and addons
  • Hardware specifications and capabilities

Note: This endpoint is publicly accessible and does not require authentication.

query Parameters
location
string (PodLocations)
Enum: "pod_1" "pod_2" "pod_3" "pod_5"
Example: location=pod_1

Datacenter location identifier to get location-specific pricing. Available locations can be retrieved from the inventory locations endpoint.

Responses

Response samples

Content type
application/json
{
  • "hardware": {
    },
  • "addons": {
    }
}

Orders

Operations for managing orders.

Creating a New Server Order

Follow this workflow to create and track a new server order:

  1. Check Inventory Availability - Use the GET /v2/inventory/{pod_location}/availability endpoint to verify that your desired hardware SKU is available in the target datacenter location.

  2. Create the Order - Submit a POST /v1/accounts/{accountId}/orders request with your desired configuration (hardware SKU, location, type, and quantity).

  3. Monitor Order Status - Use GET /v1/orders/{orderId} to retrieve the order and check the clouds_deployed field. Each item in the clouds_deployed array contains:

    • id - The cloud resource identifier
    • provisioning_status - Current provisioning state with progression: pendingin_progressawaiting_setupcomplete
    • If errors occur during provisioning, the cloud may enter a manual_setup state requiring support intervention
  4. Query Cloud Details - Once you have the cloud ID from clouds_deployed[].id, use the GET /v1/clouds/{cloudId} endpoint to retrieve detailed information about the provisioned cloud, including its provision_status and other configuration details.

Get a list of orders

Retrieve a list of all orders that have been created by you or organizations that you are a member of.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get an order by ID

Retrieve a specific order by its ID to view details and check the status of the order.

Authorizations:
bearerAuth
path Parameters
orderId
required
string

The ID of the order to retrieve.

Responses

Response samples

Content type
application/json
{
  • "label": "Test PCC Order v2 with pending tasks check",
  • "description": "Baremetal Medium V4 cluster in Ashburn, VA with 1 node to run production workloads.",
  • "fields": {
    },
  • "id": "PGZYNxBpg3",
  • "type": "orders",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "access": {
    }
}

Create a new order

Create a new order for baremetal servers or private cloud products running OpenStack.

Authorizations:
bearerAuth
path Parameters
accountId
required
string
Example: mWLBVbB7Eq

The ID of the organization account to create the order for.

Request Body schema: application/json
required
label
required
string

A user-friendly name for the order.

description
string

A brief description of the order (optional).

required
object (OrderFields)

The product selections and configuration options for an order.

Responses

Request samples

Content type
application/json
Example

A baremetal order with Operating System specified.

{
  • "label": "Baremetal Medium V4 with Ubuntu 22.04 LTS",
  • "description": "Baremetal Medium V4 cluster in Ashburn, VA with 1 node to run production workloads.",
  • "fields": {
    }
}

Response samples

Content type
application/json
{
  • "label": "Test PCC Order v2 with pending tasks check",
  • "description": "Baremetal Medium V4 cluster in Ashburn, VA with 1 node to run production workloads.",
  • "fields": {
    },
  • "id": "PGZYNxBpg3",
  • "type": "orders",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "access": {
    }
}

VLANs

Operations for managing Virtual LAN (VLAN) resources for private clouds.

Get a list of VLANs

Retrieve a list of all VLAN resources that have been created by you or organizations that you are a member of.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a VLAN by ID

Retrieve details of a specific VLAN resource by its ID.

Authorizations:
bearerAuth
path Parameters
vlanId
required
string
Example: vl4nXy2Z9a

The ID of the VLAN resource to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": "vl4nXy2Z9a",
  • "type": "vlans",
  • "label": "production-vlan",
  • "description": "VLAN for production workloads",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Update a VLAN

Update an existing VLAN resource.

Note: Only user-created VLANs can be modified. System-reserved VLANs (control, compute, storage, tunnel, octavia, inventory, provider) cannot be altered.

Authorizations:
bearerAuth
path Parameters
vlanId
required
string
Example: vl4nXy2Z9a

The ID of the VLAN resource to update.

Request Body schema: application/json
required
label
string

A user-friendly name for the VLAN.

description
string

A description of the VLAN.

Responses

Request samples

Content type
application/json
{
  • "label": "production-vlan",
  • "description": "VLAN for production workloads"
}

Response samples

Content type
application/json
{
  • "id": "vl4nXy2Z9a",
  • "type": "vlans",
  • "label": "production-vlan",
  • "description": "VLAN for production workloads",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Create a new VLAN

Create a new VLAN resource in a specified datacenter location.

VLANs can optionally be assigned to a cloud and/or have an IP Address Block assigned during creation.

Authorizations:
bearerAuth
path Parameters
accountId
required
string
Example: mWLBVbB7Eq

The ID of the organization account to create the VLAN for.

Request Body schema: application/json
required
label
required
string

A user-friendly name for the VLAN.

description
string

A description of the VLAN (optional).

required
object

Responses

Request samples

Content type
application/json
Example

Create a VLAN in a specific location without cloud assignment.

{
  • "label": "my-custom-vlan",
  • "description": "Custom VLAN for development environment",
  • "fields": {
    }
}

Response samples

Content type
application/json
{
  • "id": "vl4nXy2Z9a",
  • "type": "vlans",
  • "label": "production-vlan",
  • "description": "VLAN for production workloads",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Assign an IP Address Block to a VLAN

Assign an existing IP Address Block (prefix) resource to a VLAN.

Requirements:

  • Both resources must be in the same datacenter location
  • Both resources must be owned by the same organization
  • The IP Address Block must not already be assigned to another VLAN
Authorizations:
bearerAuth
path Parameters
vlanId
required
string
Example: vl4nXy2Z9a

The ID of the VLAN resource.

prefixId
required
string
Example: pf3xY7z2W9

The ID of the IP Address Block (prefix) resource to assign.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

IP Address Blocks

Operations for managing IP prefix (IP Address Block) resources for private clouds.

Get a list of IP Address Blocks

Retrieve a list of all IP Address Block (prefix) resources that have been created by you or organizations that you are a member of.

IP Address Blocks are network prefixes (CIDR blocks) used for IP address allocation in private clouds.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get an IP Address Block by ID

Retrieve details of a specific IP Address Block resource by its ID.

Authorizations:
bearerAuth
path Parameters
prefixId
required
string
Example: pf3xY7z2W9

The ID of the IP Address Block resource to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": "pf3xY7z2W9",
  • "type": "prefixes",
  • "label": "production-ips",
  • "description": "IP range for production servers",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Update an IP Address Block

Update an existing IP Address Block resource.

Authorizations:
bearerAuth
path Parameters
prefixId
required
string
Example: pf3xY7z2W9

The ID of the IP Address Block resource to update.

Request Body schema: application/json
required
label
string

A user-friendly name for the IP Address Block.

description
string

A description of the IP Address Block.

Responses

Request samples

Content type
application/json
{
  • "label": "production-ips",
  • "description": "IP range for production servers"
}

Response samples

Content type
application/json
{
  • "id": "pf3xY7z2W9",
  • "type": "prefixes",
  • "label": "production-ips",
  • "description": "IP range for production servers",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}

Create a new IP Address Block

Create a new IP Address Block (network prefix) resource in a specified datacenter location.

IP Address Blocks can be created with a specific CIDR or by specifying a prefix length to automatically allocate from available address space.

Important: An IP Address Block must be assigned to a VLAN for use. Create the appropriate internal or routed VLAN to assign this IP Address Block to. IP Blocks can be assigned to a VLAN during IP Block creation (via central_vlan_id) or after creation in a separate request.

Authorizations:
bearerAuth
path Parameters
accountId
required
string
Example: mWLBVbB7Eq

The ID of the organization account to create the IP Address Block for.

Request Body schema: application/json
required
label
required
string

A user-friendly name for the IP Address Block.

description
string

A description of the IP Address Block (optional).

required
object

Responses

Request samples

Content type
application/json
Example

Create a private IP Address Block with a specific CIDR block.

{
  • "label": "Private IP Address Block",
  • "description": "IP Block Description",
  • "fields": {
    }
}

Response samples

Content type
application/json
{
  • "id": "pf3xY7z2W9",
  • "type": "prefixes",
  • "label": "production-ips",
  • "description": "IP range for production servers",
  • "created_at": "2025-08-27T20:05:56+00:00",
  • "updated_at": "2025-08-27T20:05:56+00:00",
  • "is_active": true,
  • "created_by": "o6aQxVGezj",
  • "fields": {
    }
}