Add Address to Bundle
curl --request POST \
--url https://api.octav.fi/v1/bundles/{bundleId}/addresses \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"
}
'import requests
url = "https://api.octav.fi/v1/bundles/{bundleId}/addresses"
payload = { "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984" }
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({address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'})
};
fetch('https://api.octav.fi/v1/bundles/{bundleId}/addresses', 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.octav.fi/v1/bundles/{bundleId}/addresses",
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([
'address' => '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'
]),
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://api.octav.fi/v1/bundles/{bundleId}/addresses"
payload := strings.NewReader("{\n \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\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://api.octav.fi/v1/bundles/{bundleId}/addresses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octav.fi/v1/bundles/{bundleId}/addresses")
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 \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Treasury Wallets",
"addresses": [
"0x6426af179aabebe47666f345d69fd9079673f6cd",
"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more addresses are invalid"
}
}{
"message": "Unauthorized"
}{
"message": "Not enough credits",
"creditsRequired": 1,
"creditsAvailable": 0
}{
"error": {
"code": "BUNDLE_NOT_FOUND",
"message": "Bundle not found"
}
}{
"error": {
"code": "BUNDLE_ADDRESS_NOT_IN_ADDRESS_BOOK",
"message": "Not in the address book: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984. Add them before bundling them.",
"addresses": [
"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"
]
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Error while fetching the address book"
}
}Bundles
Add Address to Bundle
Add one address to a bundle. The address must already be in the address book.
Cost: 1 credit per call. Automatically refunded on 4xx/5xx responses.
Access: Requires portfolio entitlement — the same flag that unlocks /v1/portfolio.
Rate limit: 360 req/min (shared with portfolio bucket)
Get your API key: Dev Portal
POST
/
bundles
/
{bundleId}
/
addresses
Add Address to Bundle
curl --request POST \
--url https://api.octav.fi/v1/bundles/{bundleId}/addresses \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"
}
'import requests
url = "https://api.octav.fi/v1/bundles/{bundleId}/addresses"
payload = { "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984" }
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({address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'})
};
fetch('https://api.octav.fi/v1/bundles/{bundleId}/addresses', 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.octav.fi/v1/bundles/{bundleId}/addresses",
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([
'address' => '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'
]),
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://api.octav.fi/v1/bundles/{bundleId}/addresses"
payload := strings.NewReader("{\n \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\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://api.octav.fi/v1/bundles/{bundleId}/addresses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octav.fi/v1/bundles/{bundleId}/addresses")
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 \"address\": \"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Treasury Wallets",
"addresses": [
"0x6426af179aabebe47666f345d69fd9079673f6cd",
"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more addresses are invalid"
}
}{
"message": "Unauthorized"
}{
"message": "Not enough credits",
"creditsRequired": 1,
"creditsAvailable": 0
}{
"error": {
"code": "BUNDLE_NOT_FOUND",
"message": "Bundle not found"
}
}{
"error": {
"code": "BUNDLE_ADDRESS_NOT_IN_ADDRESS_BOOK",
"message": "Not in the address book: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984. Add them before bundling them.",
"addresses": [
"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"
]
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Error while fetching the address book"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The bundle's id
Body
application/json
A single address, already present in the address book.
Response
The updated bundle
A named group of addresses drawn from the address book. Sharing settings, report recurrence, and virtual user membership are deliberately omitted from the API surface.
Show child attributes
Show child attributes
Example:
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Treasury Wallets",
"addresses": [
"0x6426af179aabebe47666f345d69fd9079673f6cd",
"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"
]
}
Was this page helpful?