curl --request POST \
--url https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"interface": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces"
payload = {
"interface": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interface: 'crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0',
address_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces', 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://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'interface' => 'crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0',
'address_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces"
payload := strings.NewReader("{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"interface": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/web-eth0",
"subnet": {
"id": "550e8400-e29b-41d4-a716-446655440006",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/private",
"name": "private"
},
"name": "web-eth0",
"mac": "aa:bb:cc:dd:ee:ff",
"attached_to": {
"id": "550e8400-e29b-41d4-a716-446655440010",
"crn": "crn:compute:sa-saopaulo-1:my-account:instance/web-1",
"name": "web-1"
},
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"health": "unknown",
"reason": "unprobed",
"description": "Primary NIC for the web server",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Attach an interface to a floating IP
Adds the interface to the floating IP. Reattaching the same interface and address is idempotent.
Multiple direct interfaces must belong to the same VPC and require anycast support in the region. Pool-owned and load-balancer-owned addresses are refused (409); manage them through their owner. A direct interface without a health check has health unknown and remains advertised.
A public floating IP requires the interface subnet to route the family default (0.0.0.0/0 or ::/0) to an internet gateway. A private floating IP requires an interface in its allocation VPC. Each interface can receive one floating IP per family and visibility.
curl --request POST \
--url https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"interface": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces"
payload = {
"interface": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interface: 'crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0',
address_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces', 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://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'interface' => 'crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0',
'address_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces"
payload := strings.NewReader("{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://network.{region}.basaltic.sh/v1/floating-ips/{floating_ip_id}/interfaces")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interface\": \"crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/eth0\",\n \"address_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"interface": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public/interface/web-eth0",
"subnet": {
"id": "550e8400-e29b-41d4-a716-446655440006",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/private",
"name": "private"
},
"name": "web-eth0",
"mac": "aa:bb:cc:dd:ee:ff",
"attached_to": {
"id": "550e8400-e29b-41d4-a716-446655440010",
"crn": "crn:compute:sa-saopaulo-1:my-account:instance/web-1",
"name": "web-1"
},
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"health": "unknown",
"reason": "unprobed",
"description": "Primary NIC for the web server",
"address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}network:AttachFloatingIP. See NETWORK permissions for the full list, what each one covers, and an example policy.Authorizations
An OAuth 2.0 bearer token, sent as Authorization: Bearer <token>.
This is the recommended way to authenticate.
Get one by exchanging a service account's access key pair at
POST /v1/oauth/token with grant_type=client_credentials. It is the
standard client-credentials grant, so any OAuth-aware library will
obtain and refresh it for you.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Tokens last an hour by default. The same access key pair is separately your AWS SigV4 credential for the S3-compatible object endpoint, which speaks nothing else.
Headers
Optional client-generated key that makes a create replay-safe. Retrying a request with the same key returns the original outcome verbatim instead of creating a duplicate resource. Reusing a key with a different request body is rejected (422); a request whose key is still being processed returns 409. Records are honored for 24 hours. Use a UUID or similarly unique token.
255Path Parameters
Floating IP ID
Body
Response
Interface attached
An interface receiving the floating IP, with its attachment health.
Show child attributes
Show child attributes

