curl --request DELETE \
--url https://api.rafftechnologies.com/api/v1/vms/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-Project-ID: <x-project-id>' \
--data '
{
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"volume_action": "delete",
"delete_vpc": true
}
'import requests
url = "https://api.rafftechnologies.com/api/v1/vms/bulk"
payload = {
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"volume_action": "delete",
"delete_vpc": True
}
headers = {
"X-Project-ID": "<x-project-id>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {
'X-Project-ID': '<x-project-id>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
volume_action: 'delete',
delete_vpc: true
})
};
fetch('https://api.rafftechnologies.com/api/v1/vms/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.rafftechnologies.com/api/v1/vms/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'volume_action' => 'delete',
'delete_vpc' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-Project-ID: <x-project-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rafftechnologies.com/api/v1/vms/bulk"
payload := strings.NewReader("{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}")
req, _ := http.NewRequest("DELETE", url, payload)
req.Header.Add("X-Project-ID", "<x-project-id>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.rafftechnologies.com/api/v1/vms/bulk")
.header("X-Project-ID", "<x-project-id>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rafftechnologies.com/api/v1/vms/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["X-Project-ID"] = '<x-project-id>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"total_count": 123,
"success_count": 123,
"failed_count": 123,
"results": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"success": true,
"message": "<string>",
"error": "<string>"
}
]
}{
"error": "Bad Request",
"message": "X-Project-ID required"
}Bulk Delete VMs
Delete up to 50 virtual machines in a single request.
Each VM is processed independently — if some deletions fail, others still succeed. The response includes per-VM results so you can identify and retry failures.
Attached Volumes
Control what happens to volumes attached to the VMs with volume_action:
delete(default) — volumes are permanently deleted along with the VM.detach— volumes are detached and kept. They remain billable and can be re-attached to another VM.
VPC Cleanup
Set delete_vpc to true (default) to also delete each VM’s associated VPC. A VPC is only deleted if no other VMs are using it.
Billing
For VMs with active subscriptions, the remaining prepaid balance is refunded pro-rata (hourly precision) to your account balance.
curl --request DELETE \
--url https://api.rafftechnologies.com/api/v1/vms/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-Project-ID: <x-project-id>' \
--data '
{
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"volume_action": "delete",
"delete_vpc": true
}
'import requests
url = "https://api.rafftechnologies.com/api/v1/vms/bulk"
payload = {
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"volume_action": "delete",
"delete_vpc": True
}
headers = {
"X-Project-ID": "<x-project-id>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {
'X-Project-ID': '<x-project-id>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
volume_action: 'delete',
delete_vpc: true
})
};
fetch('https://api.rafftechnologies.com/api/v1/vms/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.rafftechnologies.com/api/v1/vms/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'volume_action' => 'delete',
'delete_vpc' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-Project-ID: <x-project-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rafftechnologies.com/api/v1/vms/bulk"
payload := strings.NewReader("{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}")
req, _ := http.NewRequest("DELETE", url, payload)
req.Header.Add("X-Project-ID", "<x-project-id>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.rafftechnologies.com/api/v1/vms/bulk")
.header("X-Project-ID", "<x-project-id>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rafftechnologies.com/api/v1/vms/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["X-Project-ID"] = '<x-project-id>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"volume_action\": \"delete\",\n \"delete_vpc\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"total_count": 123,
"success_count": 123,
"failed_count": 123,
"results": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"success": true,
"message": "<string>",
"error": "<string>"
}
]
}{
"error": "Bad Request",
"message": "X-Project-ID required"
}Authorizations
API key for authentication. Each key is bound to a specific account.
Headers
Project ID. Required for all mutating operations (create, delete, power actions, resize).
Body
VM IDs to delete (1–50).
1 - 50 elementsWhat to do with attached volumes. detach keeps them (still billable), delete removes them permanently.
detach, delete Whether to delete associated VPCs. Only succeeds if no other VMs are using them.
Response
Bulk deletion results
true if at least one VM was deleted successfully.
Number of VMs requested for deletion.
Number of VMs successfully deleted.
Number of VMs that failed to delete.
Per-VM deletion results.
Show child attributes
Show child attributes