curl --request PUT \
--url https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"tag_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'import requests
url = "https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags"
payload = { "tag_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({tag_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags', 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/security-groups/{id}/tags",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'tag_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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/security-groups/{id}/tags"
payload := strings.NewReader("{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"links": [
{
"tag_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag_name": "web",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"security_group_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"security_group_name": "web-server"
}
],
"job_counts": {
"pending": 123,
"running": 123,
"done": 123,
"failed": 123,
"conflict": 123,
"skipped": 123
}
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Set firewall tags
Make these the firewall’s tags in the firewall’s own project. Raff then puts the firewall on the public network interfaces of every server of that project that has one of the tags. This runs in the background, about 20 seconds per server; follow it with job_counts here or with GET /api/v1/vms/{id}/tag-firewall.
Send the full list: tags left out are unlinked. Unlinking a tag leaves its firewall on the servers. Send tag_ids: [] to unlink every tag.
In a project a tag carries at most one firewall. A tag that already carries another firewall in this project is refused with “this tag cannot carry a second firewall in this project: it already carries one”.
Needs the account.tags.manage permission (account Owner and Admin by default).
Before linking tags, you need:
- A firewall ID: get it from List firewalls
- Tag IDs: get them from List tags, or create one with Create tag
curl --request PUT \
--url https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"tag_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'import requests
url = "https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags"
payload = { "tag_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({tag_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']})
};
fetch('https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags', 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/security-groups/{id}/tags",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'tag_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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/security-groups/{id}/tags"
payload := strings.NewReader("{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rafftechnologies.com/api/v1/security-groups/{id}/tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tag_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"links": [
{
"tag_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag_name": "web",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"security_group_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"security_group_name": "web-server"
}
],
"job_counts": {
"pending": 123,
"running": 123,
"done": 123,
"failed": 123,
"conflict": 123,
"skipped": 123
}
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
API key for authentication. Each key is bound to a specific account.
Path Parameters
Security group ID (UUID).
Body
The firewall's tags after the call. Tags left out are unlinked; [] unlinks every tag.