{"openapi":"3.0.0","info":{"title":"OVHcloud API specification","description":"Specification for OVHcloud API","version":"1.0","contact":{"name":"OVH","email":"api@ml.ovh.net"}},"servers":[{"url":"https://api.eu.ovhcloud.com/v2"}],"components":{"schemas":{"any":{"description":"Can be anything (text, int, bool, json, html, etc.)","example":"This is a content of any type !"},"common.CurrentTask":{"type":"object","description":"Asynchronous operation currently running","properties":{"errors":{"type":"array","description":"Errors that occurred on the task","nullable":true,"items":{"$ref":"#/components/schemas/common.TaskError"},"readOnly":true},"id":{"type":"string","description":"Identifier of the current task","format":"uuid","readOnly":true},"link":{"type":"string","description":"Link to the task details","readOnly":true},"status":{"allOf":[{"$ref":"#/components/schemas/common.CurrentTaskStatusEnum"}],"description":"Current global status of the current task","nullable":true,"readOnly":true},"type":{"type":"string","description":"Type of the current task","readOnly":true}}},"common.CurrentTaskStatusEnum":{"type":"string","description":"Current status of a task. A task in ERROR cannot be retried without your inputs. PENDING tasks will be executed as soon as possible. A RUNNING task is currently executing your original request. SCHEDULED is used for tasks that will be executed in the future.","enum":["ERROR","PENDING","RUNNING","SCHEDULED","WAITING_USER_INPUT"]},"common.ResourceStatusEnum":{"type":"string","description":"Current status of a resource","enum":["CREATING","CREATION_PLANNED","DELETING","ERROR","OUT_OF_SYNC","READY","SUSPENDED","UNKNOWN","UPDATING"]},"common.TaskError":{"type":"object","description":"Errors that occurred on the task","properties":{"message":{"type":"string","description":"Error description","readOnly":true}}},"duration":{"type":"string","description":"Duration (e.g., P1Y2M3DT4H6M9S)","example":"P1Y2M3DT4H6M9S"},"email":{"type":"string","description":"Email address (e.g., api@ml.ovh.net)","format":"email","example":"api@ml.ovh.net"},"internationalPhoneNumber":{"type":"string","description":"International phone number","format":"phone-number"},"ip":{"type":"string","description":"IP address (e.g., 192.0.2.0)","format":"ipv4","example":"192.0.2.0"},"ipBlock":{"type":"string","description":"IP (v4 or v6) CIDR notation (e.g., 192.0.2.0/24)","format":"ip-block","example":"192.0.2.0/24"},"ipInterface":{"type":"string","description":"IP address (e.g., 192.0.2.0)","format":"ipv4","example":"192.0.2.0"},"ipv4":{"type":"string","description":"IPv4 address (e.g., 192.0.2.0)","format":"ipv4","example":"192.0.2.0"},"ipv4Block":{"type":"string","description":"IPv4 CIDR notation (e.g., 192.0.2.0/24)","format":"ipv4-block","example":"192.0.2.0/24"},"ipv6":{"type":"string","description":"IPv6 address (e.g., 2001:41d0:1:1994::1)","format":"ipv6","example":"2001:41d0:1:1994::1"},"ipv6Block":{"type":"string","description":"IPv6 CIDR notation (e.g., 2001:41d0::/128)","format":"ipv6-block","example":"2001:41d0::/128"},"macAddress":{"type":"string","description":"MAC address (e.g., 00:00:5e:00:53:01)","format":"mac-address","example":"00:00:5e:00:53:01"},"phoneNumber":{"type":"string","description":"Phone number","format":"phone-number"},"publicCloud.instance.FlavorBandwidth":{"type":"object","description":"Network bandwidth of a flavor. The bandwidth an instance of the flavor gets in Mbit/s.","properties":{"private":{"type":"integer","description":"Bandwidth on private networks (vRack) in Mbit/s. Null when the flavor does not declare it.","nullable":true,"readOnly":true},"publicInbound":{"type":"integer","description":"Inbound bandwidth on the public network in Mbit/s. Null when the flavor does not declare it.","nullable":true,"readOnly":true},"publicOutbound":{"type":"integer","description":"Outbound bandwidth on the public network in Mbit/s. Null when the flavor does not declare it.","nullable":true,"readOnly":true}}},"publicCloud.instance.ImageStatusEnum":{"type":"string","description":"Lifecycle status of an instance image as reported by OpenStack Glance. It describes where the image is in its upload and availability lifecycle. `QUEUED`: The image identifier has been reserved in the image registry, but no image data has been uploaded yet. `SAVING`: The raw image data is currently being uploaded to the image store. `IMPORTING`: The uploaded image data is being imported and processed through the Glance import workflow. `ACTIVE`: The image is fully available and can be used to boot instances. `DEACTIVATED`: Access to the image has been disabled by an administrator. The data is preserved but the image cannot be used to launch instances until reactivated. `KILLED`: An error occurred during upload or import and the image data is not usable. `PENDING_DELETE`: The image has been marked for deletion but its data has not been removed yet. It may still be restorable during the retention delay. `DELETED`: The image has been deleted and its data is scheduled for removal.","enum":["ACTIVE","DEACTIVATED","DELETED","IMPORTING","KILLED","PENDING_DELETE","QUEUED","SAVING"]},"publicCloud.instance.Instance":{"type":"object","description":"A Public Cloud compute instance: a virtual machine provisioned from a flavor and an image, connected to one or more networks and backed by block volumes. The resource follows the standard desired-state / observed-state model: targetSpec holds the specification you asked for. currentState reflects what the compute backend actually reports. resourceStatus and currentTasks describe the reconciliation between the two. Updates are performed by sending a new targetSpec on the PUT route. The requested operations (rename, resize, power change, volume attach/detach, share attach/detach) are derived from the diff.","properties":{"checksum":{"type":"string","description":"Computed hash representing the current targetSpec value. It enables optional optimistic concurrency control: the value returned by a GET may be sent back in the PUT and action payloads, and the request is then rejected with a 409 checksum-mismatch conflict if it no longer matches server-side (because another request modified the instance in the meantime). Sending no checksum skips that check and forces the write (last-write-wins).","readOnly":true},"createdAt":{"type":"string","description":"Creation date of the instance, as an ISO 8601 / RFC 3339 timestamp","format":"date-time","readOnly":true},"currentState":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceCurrentState"}],"description":"Current observed state of the instance as reported by the compute backend (name, flavor, image, location, power state, networks, attached volumes, attached shares, security groups). It is null while the instance is still being created and no backend state is available yet.","nullable":true,"readOnly":true},"currentTasks":{"type":"array","description":"In-progress operations. Ongoing asynchronous tasks reconciling currentState toward targetSpec, for example a create, resize, reboot, volume attach or share attach. Poll the instance until this list is empty and resourceStatus is READY to know the requested change has been applied.","nullable":true,"items":{"$ref":"#/components/schemas/common.CurrentTask"},"readOnly":true},"id":{"type":"string","description":"Unique identifier of the instance","format":"uuid","readOnly":true},"resourceStatus":{"allOf":[{"$ref":"#/components/schemas/common.ResourceStatusEnum"}],"description":"Resource lifecycle status. High-level readiness of the instance in the system, for example CREATING, READY, UPDATING, DELETING, ERROR. This is distinct from currentState.powerState, which carries the lower-level OpenStack administrative power state of the virtual machine.","readOnly":true},"targetSpec":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceReadTargetSpec"}],"description":"Desired specification. Last target specification requested for the instance. On update, the difference between the previous and the new targetSpec determines the operations performed (rename, resize, power change, and declarative volume/share attach-detach).","readOnly":true},"updatedAt":{"type":"string","description":"Last modification date of the instance, as an ISO 8601 / RFC 3339 timestamp","format":"date-time","readOnly":true}}},"publicCloud.instance.InstanceActionParameters":{"type":"object","description":"Optional parameters refining an imperative instance action. Each field applies only to a specific action type (see InstanceActionTypeEnum) and is ignored for other actions.","properties":{"hard":{"type":"boolean","description":"Applies only to the REBOOT action. When true, performs a hard reboot (power cycle) instead of a graceful, soft reboot. Defaults to a soft reboot.","nullable":true},"imageId":{"type":"string","description":"Applies only to the RESCUE action. Identifier of the image to boot the instance from while in rescue mode. When omitted, the backend selects a default rescue image.","nullable":true}}},"publicCloud.instance.InstanceActionRequest":{"type":"object","description":"Instance action request. Payload for triggering an imperative action on an instance, for example lock, reboot or rescue. Unlike the declarative PUT update, an action directly commands an administrative or operational state change. The checksum from the last GET may be supplied to opt in to optimistic concurrency control. Omitting it forces the action.","properties":{"checksum":{"type":"string","description":"Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the action is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the action is forced (last-write-wins).","nullable":true},"parameters":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceActionParameters"}],"description":"Optional parameters refining the requested action (see InstanceActionParameters). Only relevant for actions that accept options, such as a hard REBOOT or a RESCUE with a specific image. Omit for actions that take none.","nullable":true},"type":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceActionTypeEnum"}],"description":"Action type. The imperative action to perform on the instance (see InstanceActionTypeEnum: LOCK, UNLOCK, REBOOT, RESCUE, UNRESCUE, STOP, START, SHELVE, UNSHELVE, PAUSE, UNPAUSE, SUSPEND, RESUME)."}},"required":["type"]},"publicCloud.instance.InstanceActionTypeEnum":{"type":"string","description":"Instance action type. Imperative action that can be triggered on an instance to change its administrative or operational state. `LOCK`: Lock the instance to prevent further actions on it, protecting it from accidental or unauthorized operations. `UNLOCK`: Remove a previously set lock, re-enabling actions on the instance. `REBOOT`: Restart the instance. `RESCUE`: Boot the instance into rescue mode from a rescue image so its root disk can be inspected or repaired. `UNRESCUE`: Return the instance from rescue mode to normal operation. `STOP`: Power off the instance. Its resources remain allocated. `START`: Power on a stopped instance. `SHELVE`: Power off the instance and release its compute resources so it can be resumed later. `UNSHELVE`: Resume a shelved instance. `PAUSE`: Freeze a running instance, keeping its memory state in the RAM of the host. `UNPAUSE`: Return a paused instance to normal operation. `SUSPEND`: Save the memory state of a running instance to disk and stop it. Its resources remain allocated. `RESUME`: Restore a suspended instance from its saved memory state.","enum":["LOCK","PAUSE","REBOOT","RESCUE","RESUME","SHELVE","START","STOP","SUSPEND","UNLOCK","UNPAUSE","UNRESCUE","UNSHELVE"]},"publicCloud.instance.InstanceAvailableAction":{"type":"object","description":"Instance action availability. One instance action type and whether it can currently be triggered on the instance through the action endpoint.","properties":{"available":{"type":"boolean","description":"Whether the action can currently be triggered through the action endpoint. A call with an unavailable action is refused.","readOnly":true},"name":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceActionTypeEnum"}],"description":"Action type, as accepted by the action endpoint","readOnly":true}}},"publicCloud.instance.InstanceCreation":{"type":"object","description":"Instance creation payload. Request body for creating a Public Cloud instance (POST). It wraps the desired InstanceTargetSpec, which carries every settable field including those that become immutable once the instance exists (location, sshKeyName, placement group). userData (cloud-init) is write-only — never echoed back on GET/LIST — and, unlike those fields, remains mutable after creation via PUT, though any change to it reinstalls the instance.","properties":{"targetSpec":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceTargetSpec"}],"description":"Desired specification. Full target specification of the instance to create. See InstanceTargetSpec for the per-field creation rules and immutability constraints."}},"required":["targetSpec"]},"publicCloud.instance.InstanceCurrentState":{"type":"object","description":"Current observed state of the instance as reported by the compute backend (OpenStack/Nova). It is read-only and reflects what actually exists, as opposed to targetSpec which holds what was requested. Some collections (notably shares) are only populated on a GET of a single instance and are omitted from the LIST response.","properties":{"availableActions":{"type":"array","description":"Availability of every instance action type given the current state of the instance. Always contains exactly one entry per InstanceActionTypeEnum value, in the order of that enum, each flagged with whether it can currently be triggered through the action endpoint. For example, when the instance is locked only UNLOCK is available. While a task is in progress on the instance or when it is in error, none is available.","items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceAvailableAction"},"readOnly":true},"flavor":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceFlavor"}],"description":"Observed flavor of the instance with full details (name, vCPUs, RAM, local disk). See InstanceFlavor.","readOnly":true},"group":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceGroupRef"}],"description":"Reference to the instance (placement) group the instance belongs to. Null when it is not part of any group. Immutable after creation.","nullable":true,"readOnly":true},"hostId":{"type":"string","description":"Opaque identifier of the physical host the instance is running on, as exposed by OpenStack. Null when not available.","nullable":true,"readOnly":true},"image":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceImage"}],"description":"Observed image the instance was booted from, with full details (name, size, status). Null for boot-from-volume instances, which have no image. See InstanceImage.","nullable":true,"readOnly":true},"location":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceLocation"}],"description":"Location. Observed region and availability zone where the instance is provisioned. See InstanceLocation.","readOnly":true},"locked":{"type":"boolean","description":"Lock state. Whether the instance is locked against modifications. When locked, mutating actions are refused until it is unlocked (see the LOCK/UNLOCK actions in InstanceActionTypeEnum).","readOnly":true},"name":{"type":"string","description":"Observed display name of the instance","readOnly":true},"networks":{"type":"array","description":"Observed network interfaces of the instance, with full details (network, subnet, gateway and per-interface addresses). One entry per network, plus at most one entry without an id for the public (Ext-Net) interface. Every address of the instance is reported through the entry's addresses list, each address typed FIXED, FLOATING or ADDITIONAL. There is no separate scalar address field. See InstanceNetwork.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetwork"},"readOnly":true},"powerState":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.PowerStateEnum"}],"description":"Actual administrative power state of the instance as reported by OpenStack (see PowerStateEnum). This may transiently differ from targetSpec.powerState while a power transition is in progress.","readOnly":true},"projectId":{"type":"string","description":"Identifier of the Public Cloud project the instance belongs to","readOnly":true},"securityGroups":{"type":"array","description":"References to the security groups currently attached to the instance's ports","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.securityGroup.SecurityGroupRef"},"readOnly":true},"shares":{"type":"array","description":"Observed instance-side share attachments. Only populated on a GET of a single instance (never in list responses). Mixing per-share access rules (managed directly on the share resource) with instance-side attach on the same share is unsupported and will show the share OUT_OF_SYNC. See InstanceShare.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceShare"},"readOnly":true},"sshKeyName":{"type":"string","description":"Name of the SSH key pair injected into the instance at boot. Null when none was provided.","nullable":true,"readOnly":true},"userId":{"type":"string","description":"Identifier of the OpenStack user that owns the instance","readOnly":true},"volumes":{"type":"array","description":"Observed block volumes attached to the instance, with details (name, size). See InstanceVolume.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceVolume"},"readOnly":true}}},"publicCloud.instance.InstanceFlavor":{"type":"object","description":"Observed flavor of an instance, carrying the full sizing details as reported by the backend. Used in currentState. The creation/update side references a flavor by id through InstanceFlavorRef.","properties":{"bandwidth":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.FlavorBandwidth"}],"description":"Network bandwidth of the flavor in Mbit/s. Null when the flavor is not in the catalog.","nullable":true,"readOnly":true},"disk":{"type":"integer","description":"Size of the flavor's local root disk in GB","readOnly":true},"gpus":{"type":"integer","description":"Number of physical GPUs provided by the flavor, 0 for flavors without GPU","readOnly":true},"id":{"type":"string","description":"Unique identifier of the flavor","format":"uuid","readOnly":true},"name":{"type":"string","description":"Human-readable flavor name, for example the commercial flavor label","readOnly":true},"ram":{"type":"integer","description":"Amount of RAM provided by the flavor in MB","readOnly":true},"vcpus":{"type":"integer","description":"Number of virtual CPUs provided by the flavor","readOnly":true}}},"publicCloud.instance.InstanceFlavorRef":{"type":"object","description":"User-controlled reference to the flavor that sizes the instance, used in targetSpec. It carries only the flavor id. The full observed sizing is exposed in currentState through InstanceFlavor.","properties":{"id":{"type":"string","description":"Identifier of the flavor to size the instance with. Changing it on update triggers a resize.","format":"uuid"}},"required":["id"]},"publicCloud.instance.InstanceGroupRef":{"type":"object","description":"Reference to the instance (placement) group the instance belongs to, controlling affinity/anti-affinity placement. Used in targetSpec to place the instance at creation and echoed in currentState. The group is set only at creation time and is immutable afterward. OpenStack/Nova server groups cannot be changed, so membership cannot be modified on a running instance.","properties":{"id":{"type":"string","description":"Identifier of the instance group. Honored only at creation time. The group cannot be changed afterward.","format":"uuid"}},"required":["id"]},"publicCloud.instance.InstanceImage":{"type":"object","description":"Observed image an instance was booted from, carrying the full details as reported by OpenStack Glance. Used in currentState. The creation/update side references an image by id through InstanceImageRef.","properties":{"defaultUser":{"type":"string","description":"Default login user of the image, as set by its publisher, for example almalinux or ubuntu. Null when the image declares none.","nullable":true,"readOnly":true},"deprecated":{"type":"boolean","description":"Whether the image is flagged as deprecated. A deprecated image can still boot existing instances but is no longer recommended for new ones.","readOnly":true},"id":{"type":"string","description":"Unique identifier of the image","format":"uuid","readOnly":true},"name":{"type":"string","description":"Human-readable image name. Null when not reported by the backend.","nullable":true,"readOnly":true},"size":{"type":"integer","description":"Size of the image in bytes. Null when the backend does not report it.","nullable":true,"readOnly":true},"status":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.ImageStatusEnum"}],"description":"Lifecycle status of the image as reported by Glance (see ImageStatusEnum). Null when not reported.","nullable":true,"readOnly":true}}},"publicCloud.instance.InstanceImageRef":{"type":"object","description":"User-controlled reference to the image the instance boots from, used in targetSpec. It carries only the image id. The full observed image is exposed in currentState through InstanceImage.","properties":{"id":{"type":"string","description":"Identifier of the image to boot from. Changing it on update triggers a rebuild of the instance.","format":"uuid"}},"required":["id"]},"publicCloud.instance.InstanceLocation":{"type":"object","description":"Instance location. Geographic placement of an instance: the region and, optionally, the availability zone within that region. In targetSpec it is the desired placement (immutable after creation). In currentState it is the observed placement.","properties":{"availabilityZone":{"type":"string","description":"Availability zone within the region where the instance is placed. When omitted at creation the backend selects a zone automatically. Immutable after creation.","nullable":true},"region":{"type":"string","description":"Code of the region where the instance is provisioned, for example GRA11, BHS5. Immutable after creation. An instance cannot be moved to another region."}},"required":["region"]},"publicCloud.instance.InstanceNetwork":{"type":"object","description":"Observed network interface attached to an instance, with full details as reported by the backend. Used in currentState. The creation/update side declares interfaces through InstanceNetworkRef.","properties":{"addresses":{"type":"array","description":"Every IP address through which the instance is reachable on this interface, each with its type, IP version and MAC address. It carries the interface's fixed addresses and, where applicable, the floating IP associated with it and any additional IPs routed to it. This is the single source of truth for the instance's observed addresses. Null or empty only while no address has been assigned yet. See InstanceNetworkAddress.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetworkAddress"},"readOnly":true},"gatewayId":{"type":"string","description":"Identifier of the gateway providing egress for this interface. Null when none applies.","nullable":true,"format":"uuid","readOnly":true},"id":{"type":"string","description":"Identifier of the network this interface is attached to, or null for the public (Ext-Net) interface. There is at most one entry without an id: additional IPs are reported as ADDITIONAL addresses of that public entry instead of forming their own entry.","nullable":true,"format":"uuid","readOnly":true},"subnetId":{"type":"string","description":"Identifier of the subnet this interface draws its fixed address from, or null for an entry without a network id","nullable":true,"format":"uuid","readOnly":true}}},"publicCloud.instance.InstanceNetworkAddress":{"type":"object","description":"A single IP address bound to an instance network interface, with its associated MAC address, IP version and address type","properties":{"ip":{"allOf":[{"$ref":"#/components/schemas/ip"}],"description":"IP address assigned to the interface (IPv4 or IPv6)","readOnly":true},"mac":{"allOf":[{"$ref":"#/components/schemas/macAddress"}],"description":"MAC address of the interface this IP is bound to. Null when the backend reports no interface for the address, which happens for an additional IP routed to an instance whose public interface has no visible Ext-Net address yet.","nullable":true,"readOnly":true},"type":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetworkAddressTypeEnum"}],"description":"Address type. How this address reaches the instance: FIXED for an address assigned to the interface itself, FLOATING for a floating IP NAT'd onto it, ADDITIONAL for an additional IP routed to the public interface. See InstanceNetworkAddressTypeEnum.","readOnly":true},"version":{"type":"integer","description":"IP version of the address (4 for IPv4, 6 for IPv6)","readOnly":true}}},"publicCloud.instance.InstanceNetworkAddressTypeEnum":{"type":"string","description":"Instance network address type. Nature of an IP address observed on an instance network interface, telling how the address reaches the instance. `FIXED`: An address assigned to the interface itself: the fixed address of a private interface (whether assigned by IPAM or pinned), or the platform-assigned or pinned Ext-Net address of the public interface. `FLOATING`: A floating IP NAT'd onto this interface: the address is not configured on the interface, the network translates it to the interface's fixed address. `ADDITIONAL`: An additional IP (also known as a failover IP, implemented as an ipalias) routed to the instance's public interface.","enum":["ADDITIONAL","FIXED","FLOATING"]},"publicCloud.instance.InstanceNetworkRef":{"type":"object","description":"Instance network reference (desired). User-controlled entry declaring one network interface to attach to the instance in targetSpec. Which fields are set determines the meaning of the entry: * autoAssignPublicIp alone. A public (Ext-Net) interface with a platform-assigned public IP. At most one entry of the list may set it. * ip alone, without an id and without a subnetId. A public IP the project already owns: either an additional IP, or an Ext-Net IP of the project in the instance's region. Any other address is rejected. Such an entry implicitly attaches the public (Ext-Net) interface. Several of them are allowed, and they may coexist with an autoAssignPublicIp entry. * subnetId, with an optional id. A private interface whose fixed address is assigned by IPAM. * subnetId and ip, with an optional id. A private interface where ip pins the fixed address when it falls inside the subnet CIDR, and otherwise designates an EXISTING floating IP to associate with that interface. When id is omitted on a private interface, the network of subnetId is used. When id is given, subnetId must belong to it. The enclosing networks list is declarative: adding or removing an entry attaches or detaches the corresponding interface on update.","properties":{"autoAssignPublicIp":{"type":"boolean","description":"Auto-assign public IP. Whether to attach a public (Ext-Net) interface with a public IP assigned by the platform. Only allowed on an entry that has no id, no subnetId and no ip, and at most one entry of the networks list may set it. Requires the optional instance/usePublicIP IAM action.","nullable":true},"id":{"type":"string","description":"Identifier of the private network to attach to. Optional on a private interface: when omitted, the network of subnetId is used. Omit it on an entry declaring public connectivity through autoAssignPublicIp or ip.","nullable":true,"format":"uuid"},"ip":{"allOf":[{"$ref":"#/components/schemas/ip"}],"description":"Address of this interface, whose meaning depends on the sibling fields. Without an id and a subnetId: a public IP the project already owns. An additional IP, or an Ext-Net IP of the project in the instance's region. Any other address is rejected, and the entry implicitly attaches the public (Ext-Net) interface. On a private entry (subnetId, with an optional id): pins the interface's fixed address when the address falls inside the subnet CIDR, and otherwise designates an EXISTING floating IP to associate with that interface. A public address requires the optional instance/usePublicIP IAM action.","nullable":true},"subnetId":{"type":"string","description":"Identifier of the subnet the interface draws its fixed address from. Required for a private interface. Leave unset on an entry declaring public connectivity.","nullable":true,"format":"uuid"}}},"publicCloud.instance.InstanceReadTargetSpec":{"type":"object","description":"Desired instance specification as returned on read. Last target specification requested for the instance, as returned on read (GET/LIST). It mirrors InstanceTargetSpec but relaxes the create-only constraints: fields that are mandatory at creation are not required here, and image is nullable because boot-from-volume instances have no image.","properties":{"flavor":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceFlavorRef"}],"description":"Reference to the flavor that sizes the instance (vCPUs, RAM, local disk). Carries only the flavor id. Changing the referenced flavor on PUT triggers a resize of the instance.","readOnly":true},"group":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceGroupRef"}],"description":"Optional reference to the instance (placement) group the instance is created into, controlling affinity/anti-affinity placement. Immutable: the group is set only at creation time. OpenStack/Nova server groups are immutable. There is no group change on PUT and membership cannot be changed after the instance exists.","nullable":true,"readOnly":true},"image":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceImageRef"}],"description":"Reference to the image the instance boots from. Carries only the image id. Changing the referenced image on PUT triggers a rebuild of the instance from the new image. Null for boot-from-volume instances, which have no backing image.","nullable":true,"readOnly":true},"location":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceLocation"}],"description":"Target location. Region (and optional availability zone) where the instance is provisioned. Immutable after creation. An instance cannot be moved to another region/zone, which is why location is absent from InstanceUpdateTargetSpec.","readOnly":true},"name":{"type":"string","description":"Desired display name of the instance. Changing it on PUT triggers a rename.","readOnly":true},"networks":{"type":"array","description":"Declarative list of network interfaces the instance is attached to. An entry with a subnetId, and an optional id, is a private interface, optionally carrying an ip to pin its fixed address or to associate an existing floating IP. An entry with autoAssignPublicIp alone requests a public (Ext-Net) interface with a platform-assigned public IP. An entry with ip alone attaches a public IP the project already owns, either an additional IP or an Ext-Net IP of the project in the instance's region. See InstanceNetworkRef. The list drives the desired network topology: adding or removing an entry attaches or detaches the corresponding interface on update.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetworkRef"},"readOnly":true},"powerState":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.PowerStateEnum"}],"description":"Desired administrative power state of the instance (see PowerStateEnum: ACTIVE, PAUSED, RESCUE, SHELVED, SHUTOFF, SUSPENDED). Changing it on PUT drives the corresponding power transition (start, stop, shelve, rescue, pause, suspend). Defaults to ACTIVE.","nullable":true,"readOnly":true},"securityGroups":{"type":"array","description":"Optional list of references to the security groups applied to all of the instance's ports. Each entry carries the security group id. Changing this list on PUT re-applies the resulting set of security groups to every instance port.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.securityGroup.SecurityGroupRef"},"readOnly":true},"shares":{"type":"array","description":"Declarative list of file storage (shares) attached to the instance, managed exactly like volumes: the diff of this list on PUT drives attach/detach. Attaching a share creates a Manila IP access rule for the instance's interface on the share's network. The instance must have an interface on that network or the operation errors. Detaching (removing an entry from this list) deletes the matching access rule and is idempotent. Each entry's accessLevel defaults to READ_WRITE when omitted (see InstanceShareRef).","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceShareRef"},"readOnly":true},"sshKeyName":{"type":"string","description":"Name of the SSH key pair injected into the instance at boot for initial access. Immutable / create-only: the key is injected once during provisioning and cannot be changed afterward, which is why sshKeyName is absent from InstanceUpdateTargetSpec.","nullable":true,"readOnly":true},"volumes":{"type":"array","description":"Declarative list of block volumes attached to the instance, each referencing a volume by id (see InstanceVolumeRef). Attach/detach is driven by diffing this list on PUT. There is no imperative attach/detach sub-route. Adding a volume reference attaches that volume. Removing one detaches it.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceVolumeRef"},"readOnly":true}}},"publicCloud.instance.InstanceShare":{"type":"object","description":"Observed instance-side share attachment, describing the Manila IP access rule that grants the instance access to a file storage (share). This list is only populated on a GET of a single instance. It is never returned in the LIST response. Mixing per-share access rules managed directly on the share resource with instance-side attach on the SAME share is unsupported and will make the share report OUT_OF_SYNC.","properties":{"accessLevel":{"allOf":[{"$ref":"#/components/schemas/publicCloud.storage.file.FileStorageAccessLevelEnum"}],"description":"Observed access level of the access rule for this instance (see FileStorageAccessLevelEnum: READ_ONLY, READ_WRITE)","readOnly":true},"accessTo":{"type":"string","description":"The instance IP address the Manila access rule targets. The instance's fixed IPv4 address on the share's network.","readOnly":true},"id":{"type":"string","description":"Identifier of the attached file storage (share)","format":"uuid","readOnly":true},"state":{"allOf":[{"$ref":"#/components/schemas/publicCloud.storage.file.FileStorageAccessRuleStateEnum"}],"description":"Observed state of the underlying access rule (see FileStorageAccessRuleStateEnum: ACTIVE, APPLYING, DENYING, ERROR). Null while no state has been reported yet.","nullable":true,"readOnly":true}}},"publicCloud.instance.InstanceShareRef":{"type":"object","description":"User-controlled reference declaring a file storage (share) to attach to the instance, used within the declarative shares list of targetSpec. It carries the share id and the desired access level for the attachment. Attaching creates a Manila IP access rule for the instance's interface on the share's network. The enclosing shares list is diffed on update to drive attach/detach, exactly like volumes.","properties":{"accessLevel":{"allOf":[{"$ref":"#/components/schemas/publicCloud.storage.file.FileStorageAccessLevelEnum"}],"description":"Desired access level granted to the instance for this share (see FileStorageAccessLevelEnum: READ_ONLY, READ_WRITE). Defaults to READ_WRITE.","nullable":true},"id":{"type":"string","description":"Identifier of the file storage (share) to attach. Adding this reference attaches the share to the instance. Removing it from the shares list detaches it.","format":"uuid"}},"required":["id"]},"publicCloud.instance.InstanceTargetSpec":{"type":"object","description":"Desired instance specification (creation). User-controlled specification of a compute instance, as supplied on creation (POST). It carries every settable field, including fields that become immutable once the instance exists (location, sshKeyName, group). Networks, volumes and shares are declarative lists: on update, the requested topology is reconciled by diffing these lists against the current attachments. The PUT route uses a reduced InstanceUpdateTargetSpec that only exposes the mutable fields.","properties":{"flavor":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceFlavorRef"}],"description":"Reference to the flavor that sizes the instance (vCPUs, RAM, local disk). Carries only the flavor id. Changing the referenced flavor on PUT triggers a resize of the instance."},"group":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceGroupRef"}],"description":"Optional reference to the instance (placement) group the instance is created into, controlling affinity/anti-affinity placement. Immutable after creation. The group is set only at creation time. OpenStack/Nova server groups are immutable. There is no group change on PUT and membership cannot be changed after the instance exists.","nullable":true},"image":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceImageRef"}],"description":"Reference to the image the instance boots from. Carries only the image id. Changing the referenced image on PUT triggers a rebuild of the instance from the new image.","nullable":true},"location":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceLocation"}],"description":"Target location. Region (and optional availability zone) where the instance is provisioned. Immutable after creation. An instance cannot be moved to another region/zone, which is why location is absent from InstanceUpdateTargetSpec."},"name":{"type":"string","description":"Desired display name of the instance. Changing it on PUT triggers a rename."},"networks":{"type":"array","description":"Declarative list of network interfaces the instance is attached to. An entry with a subnetId, and an optional id, is a private interface, optionally carrying an ip to pin its fixed address or to associate an existing floating IP. An entry with autoAssignPublicIp alone requests a public (Ext-Net) interface with a platform-assigned public IP. An entry with ip alone attaches a public IP the project already owns, either an additional IP or an Ext-Net IP of the project in the instance's region. See InstanceNetworkRef. The list drives the desired network topology: adding or removing an entry attaches or detaches the corresponding interface on update.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetworkRef"}},"powerState":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.PowerStateEnum"}],"description":"Desired administrative power state of the instance (see PowerStateEnum: ACTIVE, PAUSED, RESCUE, SHELVED, SHUTOFF, SUSPENDED). Changing it on PUT drives the corresponding power transition (start, stop, shelve, rescue, pause, suspend). Defaults to ACTIVE.","nullable":true},"securityGroups":{"type":"array","description":"Optional list of references to the security groups applied to all of the instance's ports. Each entry carries the security group id. Changing this list on PUT re-applies the resulting set of security groups to every instance port.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.securityGroup.SecurityGroupRef"}},"shares":{"type":"array","description":"Declarative list of file storage (shares) attached to the instance, managed exactly like volumes: the diff of this list on PUT drives attach/detach. Attaching a share creates a Manila IP access rule for the instance's interface on the share's network. The instance must have an interface on that network or the operation errors. Detaching (removing an entry from this list) deletes the matching access rule and is idempotent. Each entry's accessLevel defaults to READ_WRITE when omitted (see InstanceShareRef).","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceShareRef"}},"sshKeyName":{"type":"string","description":"Name of the SSH key pair injected into the instance at boot for initial access. Immutable after creation. The key is injected once during provisioning and cannot be changed afterward, which is why sshKeyName is absent from InstanceUpdateTargetSpec.","nullable":true},"userData":{"type":"string","description":"User data (cloud-init). Base64-encoded (strict standard encoding) cloud-init payload handed to the instance at boot through the OpenStack metadata service / config drive, and interpreted by cloud-init inside the guest image. The submitted string itself must be at most 65535 bytes once base64-encoded. Write-only: never returned by GET/LIST. Deliberately absent from InstanceReadTargetSpec and InstanceCurrentState. Not persisted or stored by the Public Cloud API: the payload is handed to the compute service, which makes it available to the instance via the metadata service. Only a non-reversible fingerprint of the value is retained, for change detection. Mutable, but destructively: changing userData on PUT REINSTALLS the instance (a Nova rebuild on the current image), wiping the root disk and all data on it. See InstanceUpdateTargetSpec for the tri-state update semantics.","nullable":true},"volumes":{"type":"array","description":"Declarative list of block volumes attached to the instance, each referencing a volume by id (see InstanceVolumeRef). Attach/detach is driven by diffing this list on PUT. There is no imperative attach/detach sub-route. Adding a volume reference attaches that volume. Removing one detaches it.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceVolumeRef"}}},"required":["flavor","location","name"]},"publicCloud.instance.InstanceUpdate":{"type":"object","description":"Instance update payload. Request body for updating a Public Cloud instance (PUT). It wraps the reduced InstanceUpdateTargetSpec (mutable fields only) together with an optional checksum for optimistic concurrency control. The operation actually performed (rename, resize, power change, volume/share attach-detach) is derived from the diff against the current targetSpec.","properties":{"checksum":{"type":"string","description":"Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the update is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the update is forced (last-write-wins).","nullable":true},"targetSpec":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceUpdateTargetSpec"}],"description":"Desired specification (mutable fields). Updated target specification restricted to the fields that can change after creation. Immutable fields (location, sshKeyName, placement group) are intentionally absent. See InstanceUpdateTargetSpec. userData is write-only (never echoed back) and follows tri-state semantics. Changing it (clearing or replacing) reinstalls the instance."}},"required":["targetSpec"]},"publicCloud.instance.InstanceUpdateTargetSpec":{"type":"object","description":"Desired instance specification (update). Reduced target specification used on the PUT route, exposing only the fields that can change after creation. Immutable, create-only fields are intentionally absent: location, sshKeyName and the placement group cannot be changed once the instance exists. Networks, volumes and shares remain declarative: the requested topology is reconciled by diffing these lists against the current attachments.","properties":{"flavor":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceFlavorRef"}],"description":"Reference to the desired flavor (vCPUs, RAM, local disk). Carries only the flavor id. Sending a different flavor triggers a resize of the instance."},"image":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.InstanceImageRef"}],"description":"Reference to the desired image. Carries only the image id. Sending a different image triggers a rebuild of the instance from the new image.","nullable":true},"name":{"type":"string","description":"Desired display name of the instance. Changing it triggers a rename."},"networks":{"type":"array","description":"Declarative list of network interfaces the instance is attached to (see InstanceNetworkRef). The list drives the desired network topology: adding or removing an entry attaches or detaches the corresponding interface.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceNetworkRef"}},"powerState":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.PowerStateEnum"}],"description":"Desired administrative power state (see PowerStateEnum: ACTIVE, PAUSED, RESCUE, SHELVED, SHUTOFF, SUSPENDED). Changing it drives the corresponding power transition (start, stop, shelve, rescue, pause, suspend). A move OpenStack cannot make in one step, such as PAUSED to SHUTOFF, is rejected with ResourceInInvalidState before anything changes. The error message gives the route through ACTIVE. Defaults to ACTIVE.","nullable":true},"securityGroups":{"type":"array","description":"Optional list of references to the security groups applied to all of the instance's ports. Changing this list re-applies the resulting set of security groups to every instance port.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.securityGroup.SecurityGroupRef"}},"shares":{"type":"array","description":"Declarative list of file storage (shares) attached to the instance, managed exactly like volumes: the diff of this list drives attach/detach. Attaching a share creates a Manila IP access rule for the instance's interface on the share's network. The instance must have an interface on that network or the operation errors. Detaching (removing an entry from this list) deletes the matching access rule and is idempotent. Each entry's accessLevel defaults to READ_WRITE when omitted (see InstanceShareRef).","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceShareRef"}},"userData":{"type":"string","description":"User data (cloud-init). Base64-encoded (strict standard encoding) cloud-init payload, at most 65535 bytes once base64-encoded. Write-only: never returned by GET/LIST. Not persisted or stored by the Public Cloud API: the payload is handed to the compute service, which makes it available to the instance via the metadata service on boot/rebuild. Only a non-reversible fingerprint of the value is retained, for change detection. Tri-state: omitted or null keeps the current value unchanged. An empty string clears it. A non-empty value replaces it. Destructive: any change (clear or replace) REINSTALLS the instance — a Nova rebuild on the current image — wiping the root disk and all data on it.","nullable":true},"volumes":{"type":"array","description":"Declarative list of block volumes attached to the instance (see InstanceVolumeRef). Attach/detach is driven by diffing this list. Adding a reference attaches the volume, removing one detaches it. There is no imperative attach/detach sub-route.","nullable":true,"items":{"$ref":"#/components/schemas/publicCloud.instance.InstanceVolumeRef"}}},"required":["flavor","name"]},"publicCloud.instance.InstanceVolume":{"type":"object","description":"Observed block volume attached to an instance, carrying the details reported by the backend. Used in currentState. The creation/update side references a volume by id through InstanceVolumeRef.","properties":{"id":{"type":"string","description":"Unique identifier of the attached volume","format":"uuid","readOnly":true},"name":{"type":"string","description":"Display name of the attached volume","readOnly":true},"size":{"type":"integer","description":"Size of the attached volume in GB","readOnly":true}}},"publicCloud.instance.InstanceVolumeRef":{"type":"object","description":"User-controlled reference to a block volume attached to the instance, used within the declarative volumes list of targetSpec. It carries only the volume id. The full observed volume is exposed in currentState through InstanceVolume.","properties":{"id":{"type":"string","description":"Identifier of the volume to attach. Adding this reference attaches the volume. Removing it from the volumes list detaches it.","format":"uuid"}},"required":["id"]},"publicCloud.instance.PowerStateEnum":{"type":"string","description":"Power state of an instance as reported by OpenStack Nova, also used to express the desired power state when driving the instance. `ACTIVE`: The instance is running and powered on. `PAUSED`: The instance is paused: its state is frozen in the memory of the host, which keeps its resources allocated. `SHUTOFF`: The instance is powered off (stopped) but its resources remain allocated. `SHELVED`: The instance is shelved: it is powered off and its compute resources are released, so it can be unshelved later to resume it. `SUSPENDED`: The instance is suspended: its memory state is saved to disk and it stops running, but its resources remain allocated. `RESCUE`: The instance is booted in rescue mode from a rescue image.","enum":["ACTIVE","PAUSED","RESCUE","SHELVED","SHUTOFF","SUSPENDED"]},"publicCloud.reference.Location":{"type":"object","description":"Location of a reference entry: the region it applies to, its availability zones and whether it is activated on the project","properties":{"availabilityZones":{"type":"array","description":"Availability zones of the region, for example eu-west-par-a, eu-west-par-b and eu-west-par-c. Empty for a single-AZ region.","items":{"type":"string"},"readOnly":true},"region":{"type":"string","description":"Region name, for example GRA11","readOnly":true},"regionActivated":{"type":"boolean","description":"Whether the region is already activated on the project. When false, the region must be activated on the project before use.","readOnly":true}}},"publicCloud.reference.instance.Flavor":{"type":"object","description":"Instance flavor (catalog entry). A single compute flavor as advertised by the backend (OpenStack/Nova) for a given region. This is read-only reference data served under /reference: it describes a hardware sizing (vCPUs, RAM, disks) the project can create instances from, not an existing resource. The catalog is per-region. A flavor returned for one region is not guaranteed to exist, or to carry the same characteristics, in another (see location).","properties":{"bandwidth":{"allOf":[{"$ref":"#/components/schemas/publicCloud.instance.FlavorBandwidth"}],"description":"Network bandwidth an instance of the flavor gets in Mbit/s","readOnly":true},"description":{"type":"string","description":"Free-form description of the flavor as reported by the backend. Null when no description is advertised for this flavor.","nullable":true,"readOnly":true},"disk":{"type":"integer","description":"Size of the flavor's root disk in GB. This is the primary system disk provisioned for instances created from this flavor.","readOnly":true},"ephemeral":{"type":"integer","description":"Size of the flavor's ephemeral disk in GB. Ephemeral storage is transient. Its contents do not survive a rebuild or deletion of the instance. Zero when the flavor provides no ephemeral disk.","readOnly":true},"gpus":{"type":"integer","description":"Number of physical GPUs provided by the flavor. Zero for flavors without GPU.","readOnly":true},"id":{"type":"string","description":"Identifier. The OpenStack/Nova flavor ID. Stable within a region and used to reference the flavor when creating an instance.","format":"uuid","readOnly":true},"isPublic":{"type":"boolean","description":"Public availability. Whether the flavor is publicly available to the project. Private flavors are only visible to the projects they have been explicitly shared with.","readOnly":true},"location":{"allOf":[{"$ref":"#/components/schemas/publicCloud.reference.Location"}],"description":"Location. Region where this flavor is offered. The flavor catalog is per-region: a flavor returned for one region is not guaranteed to exist, or to carry the same characteristics, in another. regionActivated tells whether the region is already activated on the project. When false, the region must be activated on the project before use. availabilityZones lists the availability zones of the region, empty for a single-AZ region.","readOnly":true},"name":{"type":"string","description":"The backend flavor name, for example b2-7, c2-15. This is the commercial/technical name used to identify the sizing in the catalog.","readOnly":true},"ram":{"type":"integer","description":"RAM in MB. Amount of memory provided by the flavor, expressed in MB.","readOnly":true},"swap":{"type":"integer","description":"Size of the flavor's swap space in MB. Zero when the flavor provides no swap.","readOnly":true},"vcpus":{"type":"integer","description":"vCPUs. Number of virtual CPUs provided by the flavor.","readOnly":true}}},"publicCloud.securityGroup.SecurityGroupRef":{"type":"object","description":"Reference to a security group","properties":{"id":{"type":"string","description":"Identifier of the security group","format":"uuid"}},"required":["id"]},"publicCloud.storage.file.FileStorageAccessLevelEnum":{"type":"string","description":"Access levels for file storage access rules","enum":["READ_ONLY","READ_WRITE"]},"publicCloud.storage.file.FileStorageAccessRuleStateEnum":{"type":"string","description":"Possible states for a file storage access rule","enum":["ACTIVE","APPLYING","DENYING","ERROR"]},"time":{"type":"string","description":"Time (e.g., 15:04:05)","format":"time","example":"15:04:05"}},"securitySchemes":{"oAuth2AuthCode":{"type":"oauth2","description":"Oauth2","x-client-id":"1bb9c7df371741c0","x-client-secret":"a5b4de870aca620d10fbf63cd18d205b","flows":{"authorizationCode":{"authorizationUrl":"https://auth.eu.ovhcloud.com/oauth2/authorize","tokenUrl":"https://auth.eu.ovhcloud.com/oauth2/token","scopes":{"account/all":"Manage your account","all":"Manage your whole account and all your services","services/all":"Manage your services lifecycle and billing"}}}}}},"paths":{"/publicCloud/project/{projectId}/compute/instance":{"get":{"operationId":"getInstances","summary":"List instances","description":"### List instances\n\nLists all instances in the project. Each item is a full instance envelope with the same shape as the `GET` route (desired `targetSpec` and observed `currentState`).\n\n### Filesystem attachments\nFor performance, `currentState.shares` is not populated in list responses. To see the filesystems attached to a given instance, call `GET .../instance/{instanceId}` on it.\n\n### Filters\nThe optional `name`, `flavor`, `region` and `status` query parameters narrow the list. Each one can be repeated, for example `?status=READY&status=CREATING`: repeated values of the same parameter are combined with OR, and different parameters are combined with AND. Filters apply only within the instances you are authorized to list. An unknown `status` value or an unavailable `region` is rejected with a `400 InvalidParameter`.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"header","name":"X-Pagination-Cursor","description":"Pagination cursor","schema":{"type":"string"}},{"in":"header","name":"X-Pagination-Size","description":"Pagination size","schema":{"type":"integer"}},{"in":"query","name":"flavor","description":"Filter by flavor ID or flavor name. Repeatable.","schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"name","description":"Filter by instance name (case-insensitive substring match). Repeatable.","schema":{"type":"array","items":{"type":"string"}}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}},{"in":"query","name":"region","description":"Filter by instance region. An unavailable region is rejected. Repeatable.","schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"status","description":"Filter by resourceStatus. Repeatable.","schema":{"type":"array","items":{"$ref":"#/components/schemas/common.ResourceStatusEnum"}}}],"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/publicCloud.instance.Instance"}}}}},"400":{"description":"Error 400 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::BadRequest::InvalidParameter":{"value":{"class":"Client::BadRequest::InvalidParameter","message":"Invalid parameter in the request"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@10"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\nresult = client.get(\"/v2/publicCloud/project/{projectId}/compute/instance\")\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n$result = $ovh->get(\"/v2/publicCloud/project/{projectId}/compute/instance\");\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/get","required":true}],"x-response-identifier":"id","x-expanded-response":"PublicCloudInstanceInstance"},"post":{"operationId":"createInstance","summary":"Create an instance","description":"### Create an instance\n\nProvisions a new instance from the supplied `targetSpec`. Creation is asynchronous: the resource starts in `CREATING` and becomes `READY` once the backend has booted it. Poll `GET .../instance/{instanceId}` until `resourceStatus` is `READY` and `currentTasks` is empty.\n\n### Create-time-only fields (immutable afterward)\nSeveral fields can be set only at creation and can never be changed later:\n* `location` — the region (and optional availability zone) the instance is deployed in.\n* `sshKeyName` — the SSH key injected into the instance at boot.\n* `group` — placement / instance-group membership. It binds the instance to an existing instance group (Nova server group) for `AFFINITY` / `ANTI_AFFINITY` scheduling. Server-group membership is fixed by OpenStack at boot and cannot be added, removed, or changed afterward — there is no group `PUT`.\n\n### User data (cloud-init)\n`targetSpec.userData` is a base64-encoded (strict standard encoding) cloud-init payload handed to the instance at boot through the OpenStack metadata service / config drive, and interpreted by cloud-init inside the guest image. The encoded string must be at most 65535 bytes. It is write-only: the value is never returned by `GET`/`LIST`. It is also not persisted or stored by the Public Cloud API: the payload is handed to the compute service, which makes it available to the instance via the metadata service. Only a non-reversible fingerprint of the value is retained, for change detection. Unlike the create-time-only fields above, `userData` can be changed later via `PUT`. See the `PUT` route for the destructive semantics of doing so.\n\n### Declarative `volumes`\n`targetSpec.volumes` is a declarative list of block-volume references attached to the instance. Supply the volumes to attach at boot. On a subsequent `PUT` the list is diffed to attach or detach volumes (see the `PUT` route). There is no imperative attach/detach endpoint.\n\n### Declarative `shares`\n`targetSpec.shares` is a declarative list of filesystem (Manila share) attachments. Each entry references a share plus an optional per-entry `accessLevel` (defaults to `READ_WRITE`). At creation, each attach creates a Manila IP access rule for the instance's interface on the share's network. The instance must have an interface on that network. As with volumes, the list is reconciled by diffing on `PUT`.\n\n### Declarative `networks` and public IPs\n`targetSpec.networks` is a declarative list of network interfaces. Each entry is `{id?, subnetId?, ip?, autoAssignPublicIp?}`, and the fields you set decide what it means:\n* `{\"autoAssignPublicIp\": true}` — a public (Ext-Net) interface with a platform-assigned public IP. At most one entry may set it.\n* `{\"ip\": \"...\"}` without a network `id` — a public IP the project already owns: either an existing additional IP (also known as a failover IP), or an Ext-Net IP of the project in the instance's region. Any other address is rejected. Such an entry implicitly attaches the public (Ext-Net) interface. Several are allowed, and they may coexist with an `autoAssignPublicIp` entry.\n* `{\"id\": \"...\", \"subnetId\": \"...\"}` — a private interface whose fixed address is assigned by IPAM.\n* `{\"id\": \"...\", \"subnetId\": \"...\", \"ip\": \"...\"}` — a private interface where `ip` pins the fixed address when it falls inside the subnet CIDR, and otherwise designates an existing floating IP to associate with that interface (the floating IP must already exist).\n\nAny entry that sets `autoAssignPublicIp` or carries a public `ip` requires the optional `instance/usePublicIP` IAM action, including floating IP associations.\n\nIn `currentState.networks` the shape is different: there is one entry per network plus at most one id-less entry for the public (Ext-Net) interface, and every address is reported through that entry's `addresses` list. There is no scalar `ip`. Each address carries a `type`: `FIXED` for an address configured on the interface itself (a private fixed address, whether IPAM-assigned or pinned, and the Ext-Net address), `FLOATING` for a floating IP associated with the interface, and `ADDITIONAL` for an additional IP routed to the public interface (additional IPs no longer form their own entry). `autoAssignPublicIp` is never echoed back, because the backend cannot distinguish a platform-assigned address from a pinned one.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.InstanceCreation"},"examples":{"Create instance":{"value":{"targetSpec":{"flavor":{"id":"068a57cf-b1b4-428f-9b17-4f32a526390c"},"image":{"id":"8d75e170-1ef9-4e25-8fc8-d231929e56e8"},"location":{"region":"GRA1"},"name":"b2-7-gra1","networks":[{"autoAssignPublicIp":true},{"id":"07e9dc62-8879-4a84-afc9-aae07640f4d9","ip":"141.94.203.10","subnetId":"de04e8aa-f187-11f0-8eac-0050568ce122"}],"sshKeyName":"example-key","userData":"I2Nsb3VkLWNvbmZpZwpwYWNrYWdlX3VwZGF0ZTogdHJ1ZQ==","volumes":[{"id":"3809b388-066f-4c79-9d77-881a7cd19629"}]}},"summary":"Create an instance with minimal target spec"}}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.Instance"}}}},"400":{"description":"Error 400 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::BadRequest::InvalidParameter":{"value":{"class":"Client::BadRequest::InvalidParameter","message":"Invalid parameter in the request"}}}}}},"409":{"description":"Error 409 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::Conflict::NameAlreadyInUse":{"value":{"class":"Client::Conflict::NameAlreadyInUse","message":"This name is already in use"}},"Client::Conflict::RegionInMaintenance":{"value":{"class":"Client::Conflict::RegionInMaintenance","message":"This region is currently in maintenance"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@30"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\n# Request body type: publicCloud.instance.InstanceCreation\nresult = client.post(\"/v2/publicCloud/project/{projectId}/compute/instance\",\n\ttargetSpec = None, # Desired specification. Full target specification of the instance to create. See InstanceTargetSpec for the per-field creation rules and immutability constraints. (type: publicCloud.instance.InstanceTargetSpec)\n)\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n// Request body type: publicCloud.instance.InstanceCreation\n$result = $ovh->post(\"/v2/publicCloud/project/{projectId}/compute/instance\", array(\n\ttargetSpec => null, // Desired specification. Full target specification of the instance to create. See InstanceTargetSpec for the per-field creation rules and immutability constraints. (type: publicCloud.instance.InstanceTargetSpec)\n));\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/create","required":true},{"name":"publicCloudProject:apiovh:instance/usePublicIP","description":"Required when any networks entry sets autoAssignPublicIp or carries a public ip, including floating IP associations","required":false}]}},"/publicCloud/project/{projectId}/compute/instance/{instanceId}":{"delete":{"operationId":"deleteInstance","summary":"Delete an instance","description":"### Delete an instance\n\nPermanently deletes a Public Cloud instance. Deletion is asynchronous: the resource transitions to `DELETING`, the response echoes the instance, and the backend then removes it. Poll `GET .../instance/{instanceId}` until it returns `InstanceDoesNotExist` (`404`) to confirm removal.\n\nBehavior\n* Independent block volumes attached to the instance are detached, not deleted — they are separate resources and survive.\n* Filesystem (share) attachments are released as part of the teardown.\n\nA delete already in progress is reported as `ResourceAlreadyBeingDeleted`. An instance in a transient or otherwise invalid state may be rejected with `ResourceInInvalidState`.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"path","name":"instanceId","description":"Instance ID","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.Instance"}}}},"404":{"description":"Error 404 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::NotFound::InstanceDoesNotExist":{"value":{"class":"Client::NotFound::InstanceDoesNotExist","message":"Instance not found"}}}}}},"409":{"description":"Error 409 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::Conflict::ResourceAlreadyBeingDeleted":{"value":{"class":"Client::Conflict::ResourceAlreadyBeingDeleted","message":"Resource is already being deleted"}},"Client::Conflict::ResourceInInvalidState":{"value":{"class":"Client::Conflict::ResourceInInvalidState","message":"Resource cannot be modified in its current state"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@40"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\nresult = client.delete(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\")\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n$result = $ovh->delete(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\");\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/delete","required":true}]},"get":{"operationId":"getInstance","summary":"Get an instance","description":"### Get an instance\n\nReturns a single Public Cloud instance, including its desired `targetSpec` and observed `currentState`.\n\n### Optimistic concurrency\nThe `checksum` returned here is the hash of the current `targetSpec`. Keep it and send it back on any subsequent `PUT` or imperative `action` call on the instance to guard against lost updates. It is optional, but omitting it forces the write (see the `PUT` route).\n\n### Filesystem attachments\n`currentState.shares` — the list of filesystems (Manila shares) attached to the instance — is populated only on this single-instance `GET`. It is deliberately not returned by the `LIST` route for performance reasons. Fetch the individual instance when you need it.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"path","name":"instanceId","description":"Instance ID","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.Instance"},"examples":{"Example":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","createdAt":"2026-01-13T07:44:09Z","currentState":{"availableActions":[{"available":true,"name":"LOCK"},{"available":true,"name":"REBOOT"},{"available":true,"name":"RESCUE"},{"available":true,"name":"SHELVE"},{"available":false,"name":"START"},{"available":true,"name":"STOP"},{"available":false,"name":"UNLOCK"},{"available":false,"name":"UNRESCUE"},{"available":false,"name":"UNSHELVE"}],"flavor":{"bandwidth":{"private":250,"publicInbound":250,"publicOutbound":250},"disk":50,"gpus":0,"id":"068a57cf-b1b4-428f-9b17-4f32a526390c","name":"b2-7","ram":7000,"vcpus":2},"hostId":"ca6b3b32604b9708149fbc88929730102eddedc04d4bcf1ee897ac96","image":{"defaultUser":"rocky","deprecated":false,"id":"8d75e170-1ef9-4e25-8fc8-d231929e56e8","name":"Rocky Linux 9","size":10737418240,"status":"ACTIVE"},"location":{"region":"GRA1"},"locked":false,"name":"b2-7-gra1","networks":[{"addresses":[{"ip":"1.2.3.4","mac":"fa:16:3e:f6:a9:76","type":"FIXED","version":4},{"ip":"2001:41d0:394:610::284","mac":"fa:16:3e:f6:a9:76","type":"FIXED","version":6},{"ip":"57.130.10.4","mac":"fa:16:3e:f6:a9:76","type":"ADDITIONAL","version":4}]},{"addresses":[{"ip":"10.1.1.99","mac":"fa:16:3e:7c:19:c6","type":"FIXED","version":4},{"ip":"141.94.203.10","mac":"fa:16:3e:7c:19:c6","type":"FLOATING","version":4}],"gatewayId":"5b6f6d9a-0d34-4db0-bf4d-1c5c1234abcd","id":"07e9dc62-8879-4a84-afc9-aae07640f4d9","subnetId":"de04e8aa-f187-11f0-8eac-0050568ce122"}],"powerState":"ACTIVE","projectId":"356931134f174c5f88c3fe61e2203017","securityGroups":[{"id":"03d7387e-247a-11f1-a352-0050568ce122"}],"sshKeyName":"example-key","userId":"af0e25a89d734337b9c221608a84c6b5","volumes":[{"id":"3809b388-066f-4c79-9d77-881a7cd19629","name":"classic-GRA1.10GB","size":10}]},"currentTasks":[],"id":"3f49128c-48b0-44ce-ac0c-f17a68078a5c","resourceStatus":"READY","targetSpec":{"flavor":{"id":"068a57cf-b1b4-428f-9b17-4f32a526390c"},"image":{"id":"8d75e170-1ef9-4e25-8fc8-d231929e56e8"},"location":{"region":"GRA1"},"name":"b2-7-gra1","networks":[{"autoAssignPublicIp":true},{"ip":"57.130.10.4"},{"id":"07e9dc62-8879-4a84-afc9-aae07640f4d9","ip":"141.94.203.10","subnetId":"de04e8aa-f187-11f0-8eac-0050568ce122"}],"powerState":"ACTIVE","sshKeyName":"example-key","volumes":[{"id":"3809b388-066f-4c79-9d77-881a7cd19629"}]},"updatedAt":"2026-01-13T08:01:59Z"},"summary":"Example"}}}}},"404":{"description":"Error 404 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::NotFound::InstanceDoesNotExist":{"value":{"class":"Client::NotFound::InstanceDoesNotExist","message":"Instance not found"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@20"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\nresult = client.get(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\")\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n$result = $ovh->get(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\");\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/get","required":true}],"x-response-identifier":"id"},"put":{"operationId":"editInstance","summary":"Update an instance","description":"### Update an instance\n\nThis is the single, declarative route for changing an instance. You do not call verb-specific endpoints. Instead you submit a new desired `targetSpec` and the API derives the operations to perform from the diff against the current specification. (Imperative power/lifecycle operations such as reboot, start, stop, and rescue live on the separate `.../instance/{instanceId}/action` route.)\n\n### Asynchronous, desired-state model\n1. You send the new `targetSpec`, optionally together with the `checksum` from your last `GET`.\n2. If accepted, you immediately get back the instance with the updated `targetSpec` and a new `checksum`. `resourceStatus` becomes `UPDATING`.\n3. One or more asynchronous tasks reconcile `currentState` toward `targetSpec`. Poll `GET .../instance/{instanceId}` until `resourceStatus` is `READY` and `currentTasks` is empty to know the change has been applied.\n\n### Operations derived from the diff\n* Rename — changing `name` renames the instance.\n* Resize (flavor) — changing `flavor` migrates the instance to the new flavor.\n* Volume attach / detach — done declaratively by diffing the `volumes` list: adding a volume reference attaches that volume, removing one detaches it. There is no imperative attach/detach endpoint — the diff is the only mechanism.\n* Network attach / detach — done declaratively by diffing the `networks` list, whose entries are `{id?, subnetId?, ip?, autoAssignPublicIp?}`: a platform-assigned Ext-Net IP (`{\"autoAssignPublicIp\": true}`, at most one entry), a public IP the project already owns — additional IP or project Ext-Net IP in the instance's region — (`{\"ip\"}`, no network `id`), a private interface with an IPAM address (`{\"id\", \"subnetId\"}`), or a private interface with `ip` either pinning its fixed address (address inside the subnet CIDR) or associating an existing floating IP (address outside it). Any entry that sets `autoAssignPublicIp` or carries a public `ip` requires the optional `instance/usePublicIP` IAM action.\n* Filesystem (share) attach / detach — done declaratively by diffing the `shares` list. Adding an entry attaches the share: it creates a Manila IP access rule for the instance's interface on the share's network, so the instance must already have an interface on that network or the attach errors. Removing an entry detaches the share: the matching access rule is removed, and the detach is idempotent. Each entry's `accessLevel` defaults to `READ_WRITE`. Caveat: managing per-share access rules directly on the share resource *and* attaching the same share instance-side here is unsupported — the share will report `OUT_OF_SYNC`.\n\n### Immutable fields (excluded from update)\n`location`, `sshKeyName`, and `group` are set only at creation and are not part of the update. In particular, placement-group (`group`) membership cannot change post-create. OpenStack/Nova server groups are immutable and there is deliberately no group `PUT`.\n\n### Destructive update (`userData`)\nChanging `targetSpec.userData` reinstalls the instance — a Nova rebuild on its current image — which wipes the root disk and all data on it. Semantics are tri-state: omitting the field (or sending `null`) keeps the current value unchanged, an empty string `\"\"` clears it, and any other value replaces it. Both the clear and the replace trigger the reinstall. An instance with no `image` (boot-from-volume) has nothing to rebuild onto, so a `userData` change on it is rejected with a `400 InvalidParameter`.\n\n### Optimistic concurrency (`checksum`)\nThe `checksum` guards against lost updates and is optional. When you send it, it must match the server-side value: if another request modified the instance since your last `GET`, the checksum no longer matches and the request is rejected with a checksum-mismatch error (`ChecksumMismatch`). Re-`GET` the instance and retry against the fresh state. When you omit it (or send an empty string), the check is skipped and the update is forced (last-write-wins).","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"path","name":"instanceId","description":"Instance ID","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.InstanceUpdate"},"examples":{"Update instance target spec":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","targetSpec":{"flavor":{"id":"068a57cf-b1b4-428f-9b17-4f32a526390c"},"image":{"id":"8d75e170-1ef9-4e25-8fc8-d231929e56e8"},"name":"b2-7-gra1","networks":[{"autoAssignPublicIp":true},{"id":"07e9dc62-8879-4a84-afc9-aae07640f4d9","ip":"141.94.203.10","subnetId":"de04e8aa-f187-11f0-8eac-0050568ce122"}],"volumes":[{"id":"3809b388-066f-4c79-9d77-881a7cd19629"}]}},"summary":"Update flavor and image of an instance using optimistic concurrency with checksum"}}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.Instance"}}}},"400":{"description":"Error 400 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::BadRequest::InvalidParameter":{"value":{"class":"Client::BadRequest::InvalidParameter","message":"Invalid parameter in the request"}}}}}},"404":{"description":"Error 404 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::NotFound::InstanceDoesNotExist":{"value":{"class":"Client::NotFound::InstanceDoesNotExist","message":"Instance not found"}}}}}},"409":{"description":"Error 409 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::Conflict::ChecksumMismatch":{"value":{"class":"Client::Conflict::ChecksumMismatch","message":"Checksum mismatch — a concurrent update was detected. Refresh the resource and retry"}},"Client::Conflict::ResourceInInvalidState":{"value":{"class":"Client::Conflict::ResourceInInvalidState","message":"Resource cannot be modified in its current state"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@50"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\n# Request body type: publicCloud.instance.InstanceUpdate\nresult = client.put(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\",\n\tchecksum = None, # Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the update is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the update is forced (last-write-wins). (type: string, nullable)\n\ttargetSpec = None, # Desired specification (mutable fields). Updated target specification restricted to the fields that can change after creation. Immutable fields (location, sshKeyName, placement group) are intentionally absent. See InstanceUpdateTargetSpec. userData is write-only (never echoed back) and follows tri-state semantics. Changing it (clearing or replacing) reinstalls the instance. (type: publicCloud.instance.InstanceUpdateTargetSpec)\n)\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n// Request body type: publicCloud.instance.InstanceUpdate\n$result = $ovh->put(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}\", array(\n\tchecksum => null, // Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the update is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the update is forced (last-write-wins). (type: string, nullable)\n\ttargetSpec => null, // Desired specification (mutable fields). Updated target specification restricted to the fields that can change after creation. Immutable fields (location, sshKeyName, placement group) are intentionally absent. See InstanceUpdateTargetSpec. userData is write-only (never echoed back) and follows tri-state semantics. Changing it (clearing or replacing) reinstalls the instance. (type: publicCloud.instance.InstanceUpdateTargetSpec)\n));\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/edit","required":true},{"name":"publicCloudProject:apiovh:instance/usePublicIP","description":"Required when any networks entry sets autoAssignPublicIp or carries a public ip, including floating IP associations","required":false}]}},"/publicCloud/project/{projectId}/compute/instance/{instanceId}/action":{"post":{"operationId":"postInstanceAction","summary":"Run an instance action","description":"### Perform an instance action\n\nImperative endpoint for power and lifecycle actions on an instance. This is the one place such imperative operations live. Distinct from the declarative `PUT` on the instance, which reconciles desired state from a `targetSpec` diff. Actions are asynchronous: the instance transitions through the relevant transient state and the response echoes the instance. Poll `GET .../instance/{instanceId}` until `resourceStatus` is `READY` and `currentTasks` is empty.\n\n### Action `type`\nThe `type` field selects the operation:\n* `REBOOT` — reboot the instance (`parameters.hard` chooses a hard vs. soft reboot).\n* `START` / `STOP` — power the instance on / off.\n* `SHELVE` / `UNSHELVE` — shelve the instance (freeing hypervisor resources) and restore it.\n* `PAUSE` / `UNPAUSE` — freeze a running instance in the memory of the host, and unfreeze it.\n* `SUSPEND` / `RESUME` — save the memory state of a running instance to disk and stop it, and restore it.\n* `RESCUE` / `UNRESCUE` — boot into rescue mode (optionally from `parameters.imageId`) and return to normal boot.\n* `LOCK` / `UNLOCK` — lock the instance against accidental actions / modifications, and unlock it.\n\n### Optimistic concurrency (`checksum`)\nThe `checksum` is optional. When you send it, it must match the current server-side value or the action is rejected with a checksum-mismatch error. Re-`GET` and retry. When you omit it (or send an empty string), the check is skipped and the action is forced (last-write-wins). An action requested while the instance is in an incompatible state is rejected with `ResourceInInvalidState`.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"path","name":"instanceId","description":"Instance ID","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.InstanceActionRequest"},"examples":{"Lock instance":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","type":"LOCK"},"summary":"Lock an instance to prevent accidental modifications"},"Reboot instance":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","parameters":{"hard":true},"type":"REBOOT"},"summary":"Perform a hard reboot on an instance"},"Rescue instance":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","parameters":{"imageId":"8d75e170-1ef9-4e25-8fc8-d231929e56e8"},"type":"RESCUE"},"summary":"Put an instance in rescue mode"},"Unlock instance":{"value":{"checksum":"2ca2c085daf219b8fc232f7debf662d3","type":"UNLOCK"},"summary":"Unlock a previously locked instance"}}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/publicCloud.instance.Instance"}}}},"400":{"description":"Error 400 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::BadRequest::InvalidParameter":{"value":{"class":"Client::BadRequest::InvalidParameter","message":"Invalid parameter in the request"}}}}}},"404":{"description":"Error 404 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::NotFound::InstanceDoesNotExist":{"value":{"class":"Client::NotFound::InstanceDoesNotExist","message":"Instance not found"}}}}}},"409":{"description":"Error 409 response","content":{"application/json":{"schema":{"type":"object","description":"Common error model","properties":{"class":{"type":"string","description":"Class of the error"},"message":{"type":"string","description":"Error message"}}},"examples":{"Client::Conflict::ResourceInInvalidState":{"value":{"class":"Client::Conflict::ResourceInInvalidState","message":"Resource cannot be modified in its current state"}}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@35"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\n# Request body type: publicCloud.instance.InstanceActionRequest\nresult = client.post(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}/action\",\n\tchecksum = None, # Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the action is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the action is forced (last-write-wins). (type: string, nullable)\n\tparameters = None, # Optional parameters refining the requested action (see InstanceActionParameters). Only relevant for actions that accept options, such as a hard REBOOT or a RESCUE with a specific image. Omit for actions that take none. (type: publicCloud.instance.InstanceActionParameters, nullable)\n\ttype = None, # Action type. The imperative action to perform on the instance (see InstanceActionTypeEnum: LOCK, UNLOCK, REBOOT, RESCUE, UNRESCUE, STOP, START, SHELVE, UNSHELVE, PAUSE, UNPAUSE, SUSPEND, RESUME). (type: publicCloud.instance.InstanceActionTypeEnum)\n)\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n// Request body type: publicCloud.instance.InstanceActionRequest\n$result = $ovh->post(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}/action\", array(\n\tchecksum => null, // Concurrency-control checksum. Optional checksum obtained from the last GET of the instance. When supplied, it must still match the instance's current checksum or the action is rejected with a 409 checksum-mismatch conflict, protecting against a concurrent modification. When omitted or empty, the concurrency check is skipped and the action is forced (last-write-wins). (type: string, nullable)\n\tparameters => null, // Optional parameters refining the requested action (see InstanceActionParameters). Only relevant for actions that accept options, such as a hard REBOOT or a RESCUE with a specific image. Omit for actions that take none. (type: publicCloud.instance.InstanceActionParameters, nullable)\n\ttype => null, // Action type. The imperative action to perform on the instance (see InstanceActionTypeEnum: LOCK, UNLOCK, REBOOT, RESCUE, UNRESCUE, STOP, START, SHELVE, UNSHELVE, PAUSE, UNPAUSE, SUSPEND, RESUME). (type: publicCloud.instance.InstanceActionTypeEnum)\n));\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/runAction","required":true}]}},"/publicCloud/project/{projectId}/compute/instance/{instanceId}/compatibleFlavor":{"get":{"operationId":"getInstanceCompatibleFlavors","summary":"List compatible flavors","description":"### Compatible flavors\n\nReturns the list of flavors this instance can be resized to. The list is computed from the instance's current flavor and the catalog of flavors available in the instance's region.\n\nThe following rules apply to the returned list:\n\n- It excludes the instance's current flavor.\n- It includes only flavors whose disk size is greater than or equal to the current flavor's disk size (a resize cannot shrink the root disk).\n- It includes only flavors in the same region as the instance.\n- It includes only flavors whose plan is available in the instance's region.\n- It is empty for baremetal instances, which cannot be resized.\n\nEach item has the same shape as an entry from the flavor reference catalog (`publicCloud.reference.instance.Flavor`). Its `location.regionActivated` is true, since the instance's region is activated on the project. `location.availabilityZones` lists the availability zones of the region, for example eu-west-par-a, eu-west-par-b and eu-west-par-c, and is empty for a single-AZ region.","security":[{"oAuth2AuthCode":[]}],"parameters":[{"in":"header","name":"X-Pagination-Cursor","description":"Pagination cursor","schema":{"type":"string"}},{"in":"header","name":"X-Pagination-Size","description":"Pagination size","schema":{"type":"integer"}},{"in":"path","name":"instanceId","description":"Instance ID","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"projectId","description":"Project ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/publicCloud.reference.instance.Flavor"}}}}}},"tags":["Compute"],"x-developer-hub-navigation":[["Public Cloud","Compute","Instances@@@25"]],"x-badges":[{"color":"green","label":"Stable production version"}],"x-code-samples":[{"lang":"python","label":"Python","source":"'''\nFirst, install the latest release of Python wrapper: $ pip install ovh\n'''\nimport json\nimport ovh\n\n# Instantiate an OVH Client.\n# You can generate new credentials with full access to your account on\n# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\nclient = ovh.Client(\n\tendpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n\tapplication_key='xxxxxxxxxx',    # Application Key\n\tapplication_secret='xxxxxxxxxx', # Application Secret\n\tconsumer_key='xxxxxxxxxx',       # Consumer Key\n)\n\nresult = client.get(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}/compatibleFlavor\")\n\n# Pretty print\nprint(json.dumps(result, indent=4))"},{"lang":"php","label":"PHP","source":"<?php\n/**\n * First, download the latest release of PHP wrapper on github\n * And include this script into the folder with extracted files\n */\nrequire __DIR__ . '/vendor/autoload.php';\nuse \\Ovh\\Api;\n\n/**\n * Instantiate an OVH Client.\n * You can generate new credentials with full access to your account on\n * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)\n */\n$ovh = new Api('xxxxxxxxxx',  // Application Key\n               'xxxxxxxxxx',  // Application Secret\n               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)\n               'xxxxxxxxxx'); // Consumer Key\n\n$result = $ovh->get(\"/v2/publicCloud/project/{projectId}/compute/instance/{instanceId}/compatibleFlavor\");\n\nprint_r($result);\n?>"}],"x-iam-actions":[{"name":"publicCloudProject:apiovh:instance/compatibleFlavor/get","required":true}],"x-response-identifier":"id"}}},"tags":[{"name":"Compute","x-tag-expanded":false,"description":"Missing description"}]}
