> ## Documentation Index
> Fetch the complete documentation index at: https://gcore.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Create bare metal server

> Create a new bare metal server with the specified configuration.

How to get access:

For Linux,

 - Use the `user_data` field to provide a
[cloud-init script](https://cloudinit.readthedocs.io/en/latest/reference/examples.html)
in base64 to apply configurations to the instance.
- Specify the `username` and `password` to create a new user.
- When only `password` is provided, it is set as the password for the default user of the image.
- The `user_data` is ignored when the `password` is specified.


For Windows,

 - Use the `user_data` field to provide a
[cloudbase-init script](https://cloudbase-init.readthedocs.io/en/latest/userdata.html#cloud-config)
in base64 to create new users on Windows.
- Use the `password` field to set the password for the 'Admin' user on Windows.
- The password of the Admin user cannot be updated via `user_data`.
- The `username` cannot be specified in the request.



## OpenAPI

````yaml /api-reference/services_documented/cloud_api.yaml post /cloud/v1/bminstances/{project_id}/{region_id}
openapi: 3.1.0
info:
  title: Gcore OpenAPI – Cloud API
  description: >-
    This OpenAPI is an aggregated OpenAPI specification that unifies all Gcore
    products into a single file. It covers Cloud, CDN, DNS, WAAP, DDoS
    Protection, Object Storage, Streaming, and FastEdge services.
  version: '2026-05-11T15:10:30.328297+00:00'
servers:
  - url: https://api.gcore.com
security:
  - APIKey: []
tags:
  - name: Bare Metal
    x-displayName: Bare Metal
  - name: Container as a Service
    x-displayName: Container as a Service
  - name: Cost Reports
    x-displayName: Cost Reports
  - name: DDoS Protection
    x-displayName: DDoS Protection
  - name: Everywhere Inference
    x-displayName: Everywhere Inference
  - name: Everywhere Inference Apps
    x-displayName: Everywhere Inference Apps
  - name: File Shares
    x-displayName: File Shares
  - name: Floating IPs
    x-displayName: Floating IPs
  - name: Function as a Service
    x-displayName: Function as a Service
  - name: GPU Bare Metal
    x-displayName: GPU Bare Metal
  - name: GPU Virtual
    x-displayName: GPU Virtual
  - name: IP Ranges
    x-displayName: IP Ranges
  - name: Images
    x-displayName: Images
  - name: Instances
    x-displayName: Instances
  - name: Load Balancers
    x-displayName: Load Balancers
  - name: Logging
    x-displayName: Logging
  - name: Managed Kubernetes
    x-displayName: Managed Kubernetes
  - name: Managed PostgreSQL
    x-displayName: Managed PostgreSQL
  - name: Networks
    x-displayName: Networks
  - name: Placement Groups
    x-displayName: Placement Groups
  - name: Projects
    x-displayName: Projects
  - name: Quotas
    x-displayName: Quotas
  - name: Regions
    x-displayName: Regions
  - name: Registry
    x-displayName: Registry
  - name: Reservations
    x-displayName: Reservations
  - name: Reserved IPs
    x-displayName: Reserved IPs
  - name: Routers
    x-displayName: Routers
  - name: SSH Keys
    x-displayName: SSH Keys
  - name: Secrets
    x-displayName: Secrets
  - name: Security Groups
    x-displayName: Security Groups
  - name: Snapshot Schedules
    x-displayName: Snapshot Schedules
  - name: Snapshots
    x-displayName: Snapshots
  - name: Tasks
    x-displayName: Tasks
  - name: User Actions
    x-displayName: User Actions
  - name: User Role Assignments
    x-displayName: User Role Assignments
  - name: Volumes
    x-displayName: Volumes
paths:
  /cloud/v1/bminstances/{project_id}/{region_id}:
    post:
      tags:
        - Bare Metal
      summary: Create bare metal server
      description: >-
        Create a new bare metal server with the specified configuration.


        How to get access:


        For Linux,

         - Use the `user_data` field to provide a
        [cloud-init
        script](https://cloudinit.readthedocs.io/en/latest/reference/examples.html)

        in base64 to apply configurations to the instance.

        - Specify the `username` and `password` to create a new user.

        - When only `password` is provided, it is set as the password for the
        default user of the image.

        - The `user_data` is ignored when the `password` is specified.



        For Windows,

         - Use the `user_data` field to provide a
        [cloudbase-init
        script](https://cloudbase-init.readthedocs.io/en/latest/userdata.html#cloud-config)

        in base64 to create new users on Windows.

        - Use the `password` field to set the password for the 'Admin' user on
        Windows.

        - The password of the Admin user cannot be updated via `user_data`.

        - The `username` cannot be specified in the request.
      operationId: BmInstanceCreateSet.post
      parameters:
        - in: path
          name: project_id
          required: true
          description: Project ID
          schema:
            description: Project ID
            example: 1
            examples:
              - 1
            title: Project Id
            type: integer
        - in: path
          name: region_id
          required: true
          description: Region ID
          schema:
            description: Region ID
            example: 1
            examples:
              - 1
            title: Region Id
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateBareMetalServerSerializer'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskIDsSerializer'
      x-codeSamples:
        - lang: Python
          source: |-
            import os
            from gcore import Gcore

            client = Gcore(
                api_key=os.environ.get("GCORE_API_KEY"),  # This is the default and can be omitted
            )
            task_id_list = client.cloud.baremetal.servers.create(
                project_id=1,
                region_id=1,
                flavor="bm2-hf-medium",
                interfaces=[{
                    "type": "external"
                }],
            )
            print(task_id_list.tasks)
        - lang: Go
          source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/G-Core/gcore-go\"\n\t\"github.com/G-Core/gcore-go/cloud\"\n\t\"github.com/G-Core/gcore-go/option\"\n)\n\nfunc main() {\n\tclient := gcore.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\ttaskIDList, err := client.Cloud.Baremetal.Servers.New(context.TODO(), cloud.BaremetalServerNewParams{\n\t\tProjectID: gcore.Int(1),\n\t\tRegionID:  gcore.Int(1),\n\t\tFlavor:    \"bm2-hf-medium\",\n\t\tInterfaces: []cloud.BaremetalServerNewParamsInterfaceUnion{{\n\t\t\tOfExternal: &cloud.BaremetalServerNewParamsInterfaceExternal{},\n\t\t}},\n\t})\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", taskIDList.Tasks)\n}\n"
components:
  schemas:
    CreateBareMetalServerSerializer:
      example:
        flavor: bm2-hf-medium
        image_id: b5b4d65d-945f-4b98-ab6f-332319c724ef
        interfaces:
          - type: external
        name: my-bare-metal
        ssh_key_name: my-ssh-key
      examples:
        - flavor: bm2-hf-medium
          image_id: b5b4d65d-945f-4b98-ab6f-332319c724ef
          interfaces:
            - type: external
          name: my-bare-metal
          ssh_key_name: my-ssh-key
      properties:
        app_config:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          description: >-
            Parameters for the application template if creating the instance
            from an `apptemplate`.
          title: App Config
        apptemplate_id:
          description: Apptemplate ID. Either `image_id` or `apptemplate_id` is required.
          title: Apptemplate Id
          type: string
        ddos_profile:
          $ref: '#/components/schemas/BaseCreateClientProfileSerializer'
          description: Enable advanced DDoS protection for the server
        flavor:
          description: The flavor of the instance.
          example: bm2-hf-medium
          examples:
            - bm2-hf-medium
          title: Flavor
          type: string
        image_id:
          description: Image ID. Either `image_id` or `apptemplate_id` is required.
          format: uuid4
          title: Image Id
          type: string
        interfaces:
          description: >-
            A list of network interfaces for the server. You can create one or
            more interfaces - private, public, or both.
          items:
            $ref: '#/components/schemas/CreateBareMetalInterfaceSerializers'
          minItems: 1
          title: Interfaces
          type: array
        name:
          description: Server name.
          example: my-bare-metal
          examples:
            - my-bare-metal
          pattern: ^[a-zA-Z0-9][a-zA-Z 0-9._\-]{1,61}[a-zA-Z0-9._]$
          title: Name
          type: string
          x-stainless-terraform-configurability: computed_optional
        name_template:
          description: >-
            If you want server names to be automatically generated based on IP
            addresses, you can provide a name template instead of specifying the
            name manually. The template should include a placeholder that will
            be replaced during provisioning. Supported placeholders are:
            `{ip_octets}` (last 3 octets of the IP), `{two_ip_octets}`, and
            `{one_ip_octet}`.
          example:
            - my-bare-metal-{ip_octets}
          examples:
            - - my-bare-metal-{ip_octets}
          pattern: ^[a-zA-Z0-9{][a-zA-Z 0-9._\-}{]{1,61}[a-zA-Z0-9._}]$
          title: Name Template
          type: string
        password:
          description: >-
            For Linux instances, 'username' and 'password' are used to create a
            new user. When only 'password' is provided, it is set as the
            password for the default user of the image. For Windows instances,
            'username' cannot be specified. Use the 'password' field to set the
            password for the 'Admin' user on Windows. Use the 'user_data' field
            to provide a script to create new users on Windows. The password of
            the Admin user cannot be updated via 'user_data'.
          title: Password
          type: string
        ssh_key_name:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Specifies the name of the SSH keypair, created via the

            [/v1/`ssh_keys`
            endpoint](/docs/api-reference/cloud/ssh-keys/add-or-generate-ssh-key).
          examples:
            - my-ssh-key
          title: Ssh Key Name
        tags:
          $ref: '#/components/schemas/CreateTagsSerializer'
          description: >-
            Key-value tags to associate with the resource. A tag is a key-value
            pair that can be associated with a resource, enabling efficient
            filtering and grouping for better organization and management. Both
            tag keys and values have a maximum length of 255 characters. Some
            tags are read-only and cannot be modified by the user. Tags are also
            integrated with cost reports, allowing cost data to be filtered
            based on tag keys or values.
          examples:
            - my-tag: my-tag-value
          x-stainless-terraform-configurability: computed_optional
        user_data:
          description: >-
            String in base64 format. For Linux instances, 'user_data' is ignored
            when 'password' field is provided. For Windows instances, Admin user
            password is set by 'password' field and cannot be updated via
            'user_data'. Examples of the `user_data`:
            https://cloudinit.readthedocs.io/en/latest/topics/examples.html
          title: User Data
          type: string
        username:
          description: >-
            For Linux instances, 'username' and 'password' are used to create a
            new user. For Windows instances, 'username' cannot be specified. Use
            'password' field to set the password for the 'Admin' user on
            Windows.
          title: Username
          type: string
      required:
        - interfaces
        - flavor
      title: CreateBareMetalServerSerializer
      type: object
    TaskIDsSerializer:
      properties:
        tasks:
          description: >-
            List of task IDs representing asynchronous operations. Use these IDs
            to monitor operation progress:

            - `GET /v1/tasks/{task_id}` - Check individual task status and
            details

            Poll task status until completion (`FINISHED`/`ERROR`) before
            proceeding with dependent operations.
          example:
            - d478ae29-dedc-4869-82f0-96104425f565
          examples:
            - - d478ae29-dedc-4869-82f0-96104425f565
          items:
            type: string
          title: Tasks
          type: array
      required:
        - tasks
      title: TaskIDsSerializer
      type: object
    BaseCreateClientProfileSerializer:
      properties:
        fields:
          description: >-
            List of field configurations that customize the protection
            parameters for this profile
          example:
            - base_field: 10
              field_value:
                - 45046
                - 45047
          examples:
            - - base_field: 10
                field_value:
                  - 45046
                  - 45047
          items:
            $ref: '#/components/schemas/CreateClientProfileFieldSerializer'
          title: Fields
          type: array
        profile_template:
          description: >-
            Unique identifier of the DDoS protection template to use for this
            profile
          example: 123
          examples:
            - 123
          title: Profile Template
          type: integer
      required:
        - profile_template
      title: BaseCreateClientProfileSerializer
      type: object
    CreateBareMetalInterfaceSerializers:
      discriminator:
        mapping:
          any_subnet:
            $ref: '#/components/schemas/CreateBareMetalAnySubnetInterfaceSerializer'
          external:
            $ref: '#/components/schemas/CreateBareMetalExternalInterfaceSerializer'
          reserved_fixed_ip:
            $ref: >-
              #/components/schemas/CreateBareMetalReservedFixedIpInterfaceSerializer
          subnet:
            $ref: '#/components/schemas/CreateBareMetalSubnetInterfaceSerializer'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/CreateBareMetalExternalInterfaceSerializer'
        - $ref: '#/components/schemas/CreateBareMetalSubnetInterfaceSerializer'
        - $ref: '#/components/schemas/CreateBareMetalAnySubnetInterfaceSerializer'
        - $ref: >-
            #/components/schemas/CreateBareMetalReservedFixedIpInterfaceSerializer
      title: CreateBareMetalInterfaceSerializers
    CreateTagsSerializer:
      description: >-
        A tag is a key-value pair that can be associated with a resource,

        enabling efficient filtering and grouping for better organization and
        management.

        Some tags are read-only and cannot be modified by the user.

        Tags are also integrated with cost reports, allowing cost data to be
        filtered based on tag keys or values.
      patternProperties:
        ^[^\s=]+$:
          description: >-
            Tag value. Maximum 255 characters. Cannot contain tabs, newlines,
            empty string or start/end with whitespace.
          example: my-tag-value
          examples:
            - my-tag-value
          maxLength: 255
          minLength: 1
          pattern: ^[^ \t\n\r\f\v]([^\t\n\r\f\v]*[^ \t\n\r\f\v])?$
          type: string
      propertyNames:
        description: >-
          Tag key. Maximum 255 characters. Cannot contain spaces, tabs,
          newlines, empty string or '=' character.
        examples:
          - my-tag
        maxLength: 255
        minLength: 1
      title: CreateTagsSerializer
      type: object
    CreateClientProfileFieldSerializer:
      properties:
        base_field:
          description: Unique identifier of the DDoS protection field being configured
          example: 123
          examples:
            - 123
          title: Base Field
          type: integer
        field_value:
          anyOf:
            - items: {}
              type: array
            - type: integer
            - type: string
            - type: 'null'
          description: Complex value for the DDoS profile field
          examples:
            - null
            - - 100001
          title: Field Value
      required:
        - base_field
      title: CreateClientProfileFieldSerializer
      type: object
    CreateBareMetalAnySubnetInterfaceSerializer:
      example:
        floating_ip:
          existing_floating_id: 57be69f6-6f6a-4f03-a4ad-8eb86c69ec0a
          source: existing
        interface_name: my-any-subnet-interface
        ip_address: 192.168.6.9
        network_id: 59905c8e-2619-420a-b046-536096473370
        type: any_subnet
      examples:
        - floating_ip:
            existing_floating_id: 57be69f6-6f6a-4f03-a4ad-8eb86c69ec0a
            source: existing
          interface_name: my-any-subnet-interface
          ip_address: 192.168.6.9
          network_id: 59905c8e-2619-420a-b046-536096473370
          type: any_subnet
      properties:
        floating_ip:
          description: >-
            Allows the instance to have a public IP that can be reached from the
            internet.
          discriminator:
            mapping:
              existing:
                $ref: >-
                  #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
              new:
                $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            propertyName: source
          oneOf:
            - $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            - $ref: >-
                #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
          title: Floating Ip
        interface_name:
          description: >-
            Interface name. Defaults to `null` and is returned as `null` in the
            API response if not set.
          maxLength: 37
          title: Interface Name
          type: string
        ip_address:
          description: You can specify a specific IP address from your subnet.
          format: ipvanyaddress
          title: Ip Address
          type: string
        ip_family:
          anyOf:
            - $ref: '#/components/schemas/InterfaceIPFamily'
            - type: 'null'
          default: ipv4
          description: Specify `ipv4`, `ipv6`, or `dual` to enable both.
        network_id:
          description: The network where the instance will be connected.
          format: uuid4
          title: Network Id
          type: string
        port_group:
          default: 0
          description: >-
            Specifies the trunk group to which this interface belongs.
            Applicable only for bare metal servers. Each unique port group is
            mapped to a separate trunk port. Use this to control how interfaces
            are grouped across trunks.
          maximum: 3
          minimum: 0
          title: Port Group
          type: integer
        type:
          const: any_subnet
          description: >-
            Instance will be attached to a subnet with the largest count of free
            IPs.
          title: Type
          type: string
      required:
        - type
        - network_id
      title: CreateBareMetalAnySubnetInterfaceSerializer
      type: object
    CreateBareMetalExternalInterfaceSerializer:
      description: Instance will be attached to default external network
      example:
        interface_name: eth0
        ip_family: ipv4
        type: external
      examples:
        - interface_name: eth0
          ip_family: ipv4
          type: external
      properties:
        interface_name:
          description: >-
            Interface name. Defaults to `null` and is returned as `null` in the
            API response if not set.
          maxLength: 37
          title: Interface Name
          type: string
        ip_family:
          anyOf:
            - $ref: '#/components/schemas/InterfaceIPFamily'
            - type: 'null'
          default: ipv4
          description: Specify `ipv4`, `ipv6`, or `dual` to enable both.
        port_group:
          default: 0
          description: >-
            Specifies the trunk group to which this interface belongs.
            Applicable only for bare metal servers. Each unique port group is
            mapped to a separate trunk port. Use this to control how interfaces
            are grouped across trunks.
          maximum: 3
          minimum: 0
          title: Port Group
          type: integer
        type:
          const: external
          description: A public IP address will be assigned to the instance.
          title: Type
          type: string
      required:
        - type
      title: CreateBareMetalExternalInterfaceSerializer
      type: object
    CreateBareMetalReservedFixedIpInterfaceSerializer:
      example:
        floating_ip:
          source: new
        interface_name: my-interface
        port_id: 59905c8e-2619-420a-b046-536096473370
        type: reserved_fixed_ip
      examples:
        - floating_ip:
            source: new
          interface_name: my-interface
          port_id: 59905c8e-2619-420a-b046-536096473370
          type: reserved_fixed_ip
      properties:
        floating_ip:
          description: >-
            Allows the instance to have a public IP that can be reached from the
            internet.
          discriminator:
            mapping:
              existing:
                $ref: >-
                  #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
              new:
                $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            propertyName: source
          oneOf:
            - $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            - $ref: >-
                #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
          title: Floating Ip
        interface_name:
          description: >-
            Interface name. Defaults to `null` and is returned as `null` in the
            API response if not set.
          maxLength: 37
          title: Interface Name
          type: string
        port_group:
          default: 0
          description: >-
            Specifies the trunk group to which this interface belongs.
            Applicable only for bare metal servers. Each unique port group is
            mapped to a separate trunk port. Use this to control how interfaces
            are grouped across trunks.
          maximum: 3
          minimum: 0
          title: Port Group
          type: integer
        port_id:
          description: >-
            Network ID the subnet belongs to. Port will be plugged in this
            network.
          title: Port Id
          type: string
        type:
          const: reserved_fixed_ip
          description: >-
            An existing available reserved fixed IP will be attached to the
            instance. If the reserved IP is not public and you choose to add a
            floating IP, the instance will be accessible from the internet.
          title: Type
          type: string
      required:
        - type
        - port_id
      title: CreateBareMetalReservedFixedIpInterfaceSerializer
      type: object
    CreateBareMetalSubnetInterfaceSerializer:
      description: >-
        The instance will get an IP address from the selected network.

        If you choose to add a floating IP, the instance will be reachable from
        the internet.

        Otherwise, it will only have a private IP within the network.
      example:
        floating_ip:
          existing_floating_id: 57be69f6-6f6a-4f03-a4ad-8eb86c69ec0a
          source: existing
        network_id: 59905c8e-2619-420a-b046-536096473370
        subnet_id: e3c6ee77-48cb-416b-b204-11b492cc776e3
        type: subnet
      examples:
        - floating_ip:
            existing_floating_id: 57be69f6-6f6a-4f03-a4ad-8eb86c69ec0a
            source: existing
          network_id: 59905c8e-2619-420a-b046-536096473370
          subnet_id: e3c6ee77-48cb-416b-b204-11b492cc776e3
          type: subnet
      properties:
        floating_ip:
          description: >-
            Allows the instance to have a public IP that can be reached from the
            internet.
          discriminator:
            mapping:
              existing:
                $ref: >-
                  #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
              new:
                $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            propertyName: source
          oneOf:
            - $ref: '#/components/schemas/NewInstanceFloatingIpInterfaceSerializer'
            - $ref: >-
                #/components/schemas/ExistingInstanceFloatingIpInterfaceSerializer
          title: Floating Ip
        interface_name:
          description: >-
            Interface name. Defaults to `null` and is returned as `null` in the
            API response if not set.
          maxLength: 37
          title: Interface Name
          type: string
        network_id:
          description: The network where the instance will be connected.
          format: uuid4
          title: Network Id
          type: string
        port_group:
          default: 0
          description: >-
            Specifies the trunk group to which this interface belongs.
            Applicable only for bare metal servers. Each unique port group is
            mapped to a separate trunk port. Use this to control how interfaces
            are grouped across trunks.
          maximum: 3
          minimum: 0
          title: Port Group
          type: integer
        subnet_id:
          description: The instance will get an IP address from this subnet.
          format: uuid4
          title: Subnet Id
          type: string
        type:
          const: subnet
          description: >-
            The instance will get an IP address from the selected network. If
            you choose to add a floating IP, the instance will be reachable from
            the internet. Otherwise, it will only have a private IP within the
            network.
          title: Type
          type: string
      required:
        - type
        - network_id
        - subnet_id
      title: CreateBareMetalSubnetInterfaceSerializer
      type: object
    ExistingInstanceFloatingIpInterfaceSerializer:
      properties:
        existing_floating_id:
          description: >-
            An existing available floating IP id must be specified if the source
            is set to `existing`
          example: e3c6ee77-48cb-416b-b204-11b492cc776e3
          examples:
            - e3c6ee77-48cb-416b-b204-11b492cc776e3
          format: uuid4
          title: Existing Floating Id
          type: string
        source:
          const: existing
          description: >-
            An existing available floating IP will be attached to the instance.
            A floating IP is a public IP that makes the instance accessible from
            the internet, even if it only has a private IP. It works like SNAT,
            allowing outgoing and incoming traffic.
          example: existing
          examples:
            - existing
          title: Source
          type: string
      required:
        - source
        - existing_floating_id
      title: Existing floating IP
      type: object
    NewInstanceFloatingIpInterfaceSerializer:
      properties:
        source:
          const: new
          description: >-
            A new floating IP will be created and attached to the instance. A
            floating IP is a public IP that makes the instance accessible from
            the internet, even if it only has a private IP. It works like SNAT,
            allowing outgoing and incoming traffic.
          example: new
          examples:
            - new
          title: Source
          type: string
      required:
        - source
      title: New floating IP
      type: object
    InterfaceIPFamily:
      enum:
        - dual
        - ipv4
        - ipv6
      title: InterfaceIPFamily
      type: string
  securitySchemes:
    APIKey:
      description: >-
        API key for authentication. Make sure to include the word `apikey`,
        followed by a single space and then your token.

        Example: `apikey 1234$abcdef`
      type: apiKey
      in: header
      name: Authorization

````