vultr

PyPI Version TOML Python Version PyPI Downloads Pepy Total Downloads Codacy Badge Quality Gate Status GitHub Issues GitHub Contributors GitHub Discussions GitHub Forks GitHub Repo Stars GitHub Org Stars Discord Ko-fi

Python 3 wrapper for the Vultr API v2.

GitHub PyPi Docs Vultr

⬇️ Jump to the API Documentation

Install

From PyPi: https://pypi.org/project/vultr-python

python -m pip install vultr-python

From Source:

git clone https://github.com/cssnr/vultr-python.git
python -m pip install vultr-python

Usage

You will need to create an api key and whitelist your IP address for most functions.

Initialize the Vultr class with your API Key or use the VULTR_API_KEY environment variable.

from vultr import Vultr

vultr = Vultr("VULTR_API_KEY")

List plans and get available regions for that plan

plans = vultr.list_plans({"type": "vc2"})  # Filter by type
plan = plans[0]  # 0 seems to be the base plan
regions = vultr.list_regions()
available = vultr.filter_regions(regions, plan["locations"])

Get the OS list and filter by name

os_list = vultr.list_os()
ubuntu_lts = vultr.filter_os(os_list, "Ubuntu 24.04 LTS x64")

Create a new ssh key from key string

sshkey = vultr.create_key("key-name", "ssh-rsa AAAA...")
vultr.delete_key(sshkey['id'])

Create a new instance

data = {
    "os_id": ubuntu_lts["id"],
    "sshkey_id": [sshkey["id"]],
    "hostname": "my-new-host",
    "label": "my-new-host",
}
instance = vultr.create_instance(available[0], plan, **data)

Arbitrary Methods get, post, patch, put, delete

plans = vultr.get("/plans", {"type": "vc2"})
sshkey = vultr.post("/ssh-keys", name="key-name", ssh_key="ssh-rsa AAAA...")
instance = vultr.patch("/instances/{instance-id}", plan=plans[1]["id"])
database = vultr.put("/databases/{database-id}", tag="new tag")
vultr.delete("/snapshots/{snapshot-id}")

Error Handling

>>> instance = vultr.create_instance("atl", "vc2-1c-0.5gb-v6", os_id=2284)
Traceback (most recent call last):
vultr.vultr.VultrException: Error 400: Server add failed: Ubuntu 24.04 LTS x64 requires a plan with at least 1000 MB memory.

Using the VultrException class

from vultr import VultrException

try:
    instance = vultr.create_instance("atl", "vc2-1c-0.5gb-v6", os_id=2284)
except VultrException as error:
    print(error.error)
    # 'Server add failed: Ubuntu 24.04 LTS x64 requires a plan with at least 1000 MB memory.'
    print(error.status)
    # 400

 

Vultr API Reference: https://www.vultr.com/api


API Documentation

1"""
2..  include:: ../../docs/index.md
3"""
4
5from .vultr import Vultr, VultrException
6
7
8__all__ = ["Vultr", "VultrException"]
class Vultr:
  9class Vultr(object):
 10    url = "https://api.vultr.com/v2"
 11
 12    def __init__(self, api_key: Optional[str] = None):
 13        """:param api_key: Vultr API Key or `VULTR_API_KEY` Environment Variable"""
 14        self.api_key = api_key or os.getenv("VULTR_API_KEY")
 15        """Provide the API key here or with the `VULTR_API_KEY` environment variable"""
 16        self._session = requests.session()
 17        if self.api_key:
 18            self._session.headers.update({"Authorization": f"Bearer {self.api_key}"})
 19
 20    def get(self, url: str, params: Optional[dict] = None) -> Any:
 21        """
 22        GET Data
 23        :param url: Request URL. Example `/instances`
 24        :param params: Query Parameters Dictionary
 25        :return: Response Data
 26        :raises: `VultrException`
 27        """
 28        return self._req("get", f"{self.url}/{url.lstrip('/')}", params=params)
 29
 30    def post(self, url: str, **kwargs) -> Any:
 31        """
 32        POST Data
 33        :param url: Request URL. Example `/instances`
 34        :param kwargs: Request Data Keyword Arguments
 35        :return: Response Data
 36        :raises: `VultrException`
 37        """
 38        return self._req("post", f"{self.url}/{url.lstrip('/')}", kwargs)
 39
 40    def patch(self, url: str, **kwargs) -> Any:
 41        """
 42        PATCH Data
 43        :param url: Request URL. Example `/instances/{instance-id}`
 44        :param kwargs: Request Data Keyword Arguments
 45        :return: Response Data
 46        :raises: `VultrException`
 47        """
 48        return self._req("patch", f"{self.url}/{url.lstrip('/')}", kwargs)
 49
 50    def put(self, url: str, **kwargs) -> Any:
 51        """
 52        PUT Data
 53        :param url: Request URL. Example `/instances/{instance-id}`
 54        :param kwargs: Request Data Keyword Arguments
 55        :return: Response Data
 56        :raises: `VultrException`
 57        """
 58        return self._req("put", f"{self.url}/{url.lstrip('/')}", kwargs)
 59
 60    def delete(self, url: str) -> None:
 61        """
 62        DELETE a Resource
 63        :param url: Request URL. Example `/instances/{instance-id}`
 64        :return: None
 65        :raises: `VultrException`
 66        """
 67        return self._req("delete", f"{self.url}/{url.lstrip('/')}")
 68
 69    def list_os(self, params: Optional[dict] = None) -> list:
 70        url = f"{self.url}/os"
 71        return self._req("get", url, params=params)["os"]
 72
 73    def list_plans(self, params: Optional[dict] = None) -> list:
 74        url = f"{self.url}/plans"
 75        return self._req("get", url, params=params)["plans"]
 76
 77    def list_regions(self, params: Optional[dict] = None) -> list:
 78        url = f"{self.url}/regions"
 79        return self._req("get", url, params=params)["regions"]
 80
 81    def list_instances(self, params: Optional[dict] = None) -> list:
 82        url = f"{self.url}/instances"
 83        return self._req("get", url, params=params)["instances"]
 84
 85    def get_instance(self, instance: Union[str, dict], params: Optional[dict] = None) -> dict:
 86        instance_id = self._get_obj_key(instance)
 87        url = f"{self.url}/instances/{instance_id}"
 88        return self._req("get", url, params=params)["instance"]
 89
 90    def create_instance(self, region: Union[str, dict], plan: Union[str, dict], **kwargs) -> dict:
 91        data = {"region": self._get_obj_key(region), "plan": self._get_obj_key(plan)}
 92        data.update(kwargs)
 93        url = f"{self.url}/instances"
 94        return self._req("post", url, data)["instance"]
 95
 96    def update_instance(self, instance: Union[str, dict], **kwargs) -> dict:
 97        instance_id = self._get_obj_key(instance)
 98        url = f"{self.url}/instances/{instance_id}"
 99        return self._req("patch", url, kwargs)["instance"]
100
101    def delete_instance(self, instance: Union[str, dict]) -> None:
102        instance_id = self._get_obj_key(instance)
103        url = f"{self.url}/instances/{instance_id}"
104        return self._req("delete", url)
105
106    def list_keys(self, params: Optional[dict] = None) -> list:
107        url = f"{self.url}/ssh-keys"
108        return self._req("get", url, params=params)["ssh_keys"]
109
110    def get_key(self, key: Union[str, dict], params: Optional[dict] = None) -> dict:
111        key_id = self._get_obj_key(key)
112        url = f"{self.url}/ssh-keys/{key_id}"
113        return self._req("get", url, params=params)["ssh_key"]
114
115    def create_key(self, name: str, key: str, **kwargs) -> dict:
116        data = {"name": name, "ssh_key": key}
117        data.update(kwargs)
118        url = f"{self.url}/ssh-keys"
119        return self._req("post", url, data)["ssh_key"]
120
121    def update_key(self, key: Union[str, dict], **kwargs) -> None:
122        key_id = self._get_obj_key(key)
123        url = f"{self.url}/ssh-keys/{key_id}"
124        return self._req("patch", url, kwargs)["ssh_key"]
125
126    def delete_key(self, key: Union[str, dict]) -> None:
127        key_id = self._get_obj_key(key)
128        url = f"{self.url}/ssh-keys/{key_id}"
129        return self._req("delete", url)
130
131    def list_scripts(self, params: Optional[dict] = None) -> list:
132        url = f"{self.url}/startup-scripts"
133        return self._req("get", url, params=params)["startup_scripts"]
134
135    def get_script(self, script: Union[str, dict], params: Optional[dict] = None) -> dict:
136        script_id = self._get_obj_key(script)
137        url = f"{self.url}/startup-scripts/{script_id}"
138        return self._req("get", url, params=params)["startup_script"]
139
140    def create_script(self, name: str, script: str, **kwargs) -> dict:
141        data = {"name": name, "script": script}
142        data.update(kwargs)
143        url = f"{self.url}/startup-scripts"
144        return self._req("post", url, data)["startup_script"]
145
146    def update_script(self, script: Union[str, dict], **kwargs) -> None:
147        script_id = self._get_obj_key(script)
148        url = f"{self.url}/startup-scripts/{script_id}"
149        return self._req("patch", url, kwargs)["startup_script"]
150
151    def delete_script(self, script: Union[str, dict]) -> None:
152        script_id = self._get_obj_key(script)
153        url = f"{self.url}/startup-scripts/{script_id}"
154        return self._req("delete", url)
155
156    def list_ipv4(self, instance: Union[str, dict], params: Optional[dict] = None) -> list:
157        instance_id = self._get_obj_key(instance)
158        url = f"{self.url}/instances/{instance_id}/ipv4"
159        return self._req("get", url, params=params)["ipv4s"]
160
161    def create_ipv4(self, instance: Union[str, dict], **kwargs) -> dict:
162        instance_id = self._get_obj_key(instance)
163        url = f"{self.url}/instances/{instance_id}/ipv4"
164        return self._req("post", url, kwargs)["ipv4"]
165
166    def delete_ipv4(self, instance: Union[str, dict]) -> None:
167        instance_id = self._get_obj_key(instance)
168        url = f"{self.url}/instances/{instance_id}/ipv4"
169        return self._req("delete", url)
170
171    @staticmethod
172    def filter_list(item_list: List[dict], value: str, key: str = "name") -> dict:
173        """
174        Helper Function to get an Item from a List of Dictionaries
175        :param item_list: List to filter
176        :param value: Value of the Key
177        :param key: Key to check for Value
178        :return: Item or {}
179        """
180        return next((d for d in item_list if str(d.get(key, "")).lower() == value.lower()), {})
181
182    @staticmethod
183    def filter_regions(regions: list, locations: list) -> list:
184        return [d for d in regions if d["id"] in locations]
185
186    @staticmethod
187    def filter_keys(keys: list, name: str) -> dict:
188        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
189        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
190        try:
191            return next(d for d in keys if d["name"].lower() == name.lower())
192        except StopIteration:
193            return {}
194
195    @staticmethod
196    def filter_os(os_list: list, name: str) -> dict:
197        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
198        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
199        try:
200            return next(d for d in os_list if d["name"].lower() == name.lower())
201        except StopIteration:
202            return {}
203
204    @staticmethod
205    def filter_scripts(scripts: list, name: str) -> dict:
206        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
207        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
208        try:
209            return next(d for d in scripts if d["name"].lower() == name.lower())
210        except StopIteration:
211            return {}
212
213    def _req(self, method, url, data: Any = None, params: Optional[dict] = None) -> Any:
214        r = self._session.request(method, url, params=params, json=data, timeout=10)
215        if not r.ok:
216            raise VultrException(r)
217        if r.status_code == 204:
218            return None
219        if r.headers.get("content-type") == "application/json":
220            return r.json()
221        return r.text
222
223    @staticmethod
224    def _get_obj_key(obj, key="id"):
225        if isinstance(obj, str):
226            return obj
227        elif isinstance(obj, int):
228            return str(obj)
229        elif isinstance(obj, dict):
230            if key in obj:
231                return obj[key]
232        else:
233            raise ValueError(f"Unable to parse object: {key}")
Vultr(api_key: Optional[str] = None)
12    def __init__(self, api_key: Optional[str] = None):
13        """:param api_key: Vultr API Key or `VULTR_API_KEY` Environment Variable"""
14        self.api_key = api_key or os.getenv("VULTR_API_KEY")
15        """Provide the API key here or with the `VULTR_API_KEY` environment variable"""
16        self._session = requests.session()
17        if self.api_key:
18            self._session.headers.update({"Authorization": f"Bearer {self.api_key}"})
Parameters
  • api_key: Vultr API Key or VULTR_API_KEY Environment Variable
url = 'https://api.vultr.com/v2'
api_key

Provide the API key here or with the VULTR_API_KEY environment variable

def get(self, url: str, params: Optional[dict] = None) -> Any:
20    def get(self, url: str, params: Optional[dict] = None) -> Any:
21        """
22        GET Data
23        :param url: Request URL. Example `/instances`
24        :param params: Query Parameters Dictionary
25        :return: Response Data
26        :raises: `VultrException`
27        """
28        return self._req("get", f"{self.url}/{url.lstrip('/')}", params=params)

GET Data

Parameters
  • url: Request URL. Example /instances
  • params: Query Parameters Dictionary
Returns

Response Data

Raises
def post(self, url: str, **kwargs) -> Any:
30    def post(self, url: str, **kwargs) -> Any:
31        """
32        POST Data
33        :param url: Request URL. Example `/instances`
34        :param kwargs: Request Data Keyword Arguments
35        :return: Response Data
36        :raises: `VultrException`
37        """
38        return self._req("post", f"{self.url}/{url.lstrip('/')}", kwargs)

POST Data

Parameters
  • url: Request URL. Example /instances
  • kwargs: Request Data Keyword Arguments
Returns

Response Data

Raises
def patch(self, url: str, **kwargs) -> Any:
40    def patch(self, url: str, **kwargs) -> Any:
41        """
42        PATCH Data
43        :param url: Request URL. Example `/instances/{instance-id}`
44        :param kwargs: Request Data Keyword Arguments
45        :return: Response Data
46        :raises: `VultrException`
47        """
48        return self._req("patch", f"{self.url}/{url.lstrip('/')}", kwargs)

PATCH Data

Parameters
  • url: Request URL. Example /instances/{instance-id}
  • kwargs: Request Data Keyword Arguments
Returns

Response Data

Raises
def put(self, url: str, **kwargs) -> Any:
50    def put(self, url: str, **kwargs) -> Any:
51        """
52        PUT Data
53        :param url: Request URL. Example `/instances/{instance-id}`
54        :param kwargs: Request Data Keyword Arguments
55        :return: Response Data
56        :raises: `VultrException`
57        """
58        return self._req("put", f"{self.url}/{url.lstrip('/')}", kwargs)

PUT Data

Parameters
  • url: Request URL. Example /instances/{instance-id}
  • kwargs: Request Data Keyword Arguments
Returns

Response Data

Raises
def delete(self, url: str) -> None:
60    def delete(self, url: str) -> None:
61        """
62        DELETE a Resource
63        :param url: Request URL. Example `/instances/{instance-id}`
64        :return: None
65        :raises: `VultrException`
66        """
67        return self._req("delete", f"{self.url}/{url.lstrip('/')}")

DELETE a Resource

Parameters
  • url: Request URL. Example /instances/{instance-id}
Returns

None

Raises
def list_os(self, params: Optional[dict] = None) -> list:
69    def list_os(self, params: Optional[dict] = None) -> list:
70        url = f"{self.url}/os"
71        return self._req("get", url, params=params)["os"]
def list_plans(self, params: Optional[dict] = None) -> list:
73    def list_plans(self, params: Optional[dict] = None) -> list:
74        url = f"{self.url}/plans"
75        return self._req("get", url, params=params)["plans"]
def list_regions(self, params: Optional[dict] = None) -> list:
77    def list_regions(self, params: Optional[dict] = None) -> list:
78        url = f"{self.url}/regions"
79        return self._req("get", url, params=params)["regions"]
def list_instances(self, params: Optional[dict] = None) -> list:
81    def list_instances(self, params: Optional[dict] = None) -> list:
82        url = f"{self.url}/instances"
83        return self._req("get", url, params=params)["instances"]
def get_instance(self, instance: Union[str, dict], params: Optional[dict] = None) -> dict:
85    def get_instance(self, instance: Union[str, dict], params: Optional[dict] = None) -> dict:
86        instance_id = self._get_obj_key(instance)
87        url = f"{self.url}/instances/{instance_id}"
88        return self._req("get", url, params=params)["instance"]
def create_instance(self, region: Union[str, dict], plan: Union[str, dict], **kwargs) -> dict:
90    def create_instance(self, region: Union[str, dict], plan: Union[str, dict], **kwargs) -> dict:
91        data = {"region": self._get_obj_key(region), "plan": self._get_obj_key(plan)}
92        data.update(kwargs)
93        url = f"{self.url}/instances"
94        return self._req("post", url, data)["instance"]
def update_instance(self, instance: Union[str, dict], **kwargs) -> dict:
96    def update_instance(self, instance: Union[str, dict], **kwargs) -> dict:
97        instance_id = self._get_obj_key(instance)
98        url = f"{self.url}/instances/{instance_id}"
99        return self._req("patch", url, kwargs)["instance"]
def delete_instance(self, instance: Union[str, dict]) -> None:
101    def delete_instance(self, instance: Union[str, dict]) -> None:
102        instance_id = self._get_obj_key(instance)
103        url = f"{self.url}/instances/{instance_id}"
104        return self._req("delete", url)
def list_keys(self, params: Optional[dict] = None) -> list:
106    def list_keys(self, params: Optional[dict] = None) -> list:
107        url = f"{self.url}/ssh-keys"
108        return self._req("get", url, params=params)["ssh_keys"]
def get_key(self, key: Union[str, dict], params: Optional[dict] = None) -> dict:
110    def get_key(self, key: Union[str, dict], params: Optional[dict] = None) -> dict:
111        key_id = self._get_obj_key(key)
112        url = f"{self.url}/ssh-keys/{key_id}"
113        return self._req("get", url, params=params)["ssh_key"]
def create_key(self, name: str, key: str, **kwargs) -> dict:
115    def create_key(self, name: str, key: str, **kwargs) -> dict:
116        data = {"name": name, "ssh_key": key}
117        data.update(kwargs)
118        url = f"{self.url}/ssh-keys"
119        return self._req("post", url, data)["ssh_key"]
def update_key(self, key: Union[str, dict], **kwargs) -> None:
121    def update_key(self, key: Union[str, dict], **kwargs) -> None:
122        key_id = self._get_obj_key(key)
123        url = f"{self.url}/ssh-keys/{key_id}"
124        return self._req("patch", url, kwargs)["ssh_key"]
def delete_key(self, key: Union[str, dict]) -> None:
126    def delete_key(self, key: Union[str, dict]) -> None:
127        key_id = self._get_obj_key(key)
128        url = f"{self.url}/ssh-keys/{key_id}"
129        return self._req("delete", url)
def list_scripts(self, params: Optional[dict] = None) -> list:
131    def list_scripts(self, params: Optional[dict] = None) -> list:
132        url = f"{self.url}/startup-scripts"
133        return self._req("get", url, params=params)["startup_scripts"]
def get_script(self, script: Union[str, dict], params: Optional[dict] = None) -> dict:
135    def get_script(self, script: Union[str, dict], params: Optional[dict] = None) -> dict:
136        script_id = self._get_obj_key(script)
137        url = f"{self.url}/startup-scripts/{script_id}"
138        return self._req("get", url, params=params)["startup_script"]
def create_script(self, name: str, script: str, **kwargs) -> dict:
140    def create_script(self, name: str, script: str, **kwargs) -> dict:
141        data = {"name": name, "script": script}
142        data.update(kwargs)
143        url = f"{self.url}/startup-scripts"
144        return self._req("post", url, data)["startup_script"]
def update_script(self, script: Union[str, dict], **kwargs) -> None:
146    def update_script(self, script: Union[str, dict], **kwargs) -> None:
147        script_id = self._get_obj_key(script)
148        url = f"{self.url}/startup-scripts/{script_id}"
149        return self._req("patch", url, kwargs)["startup_script"]
def delete_script(self, script: Union[str, dict]) -> None:
151    def delete_script(self, script: Union[str, dict]) -> None:
152        script_id = self._get_obj_key(script)
153        url = f"{self.url}/startup-scripts/{script_id}"
154        return self._req("delete", url)
def list_ipv4(self, instance: Union[str, dict], params: Optional[dict] = None) -> list:
156    def list_ipv4(self, instance: Union[str, dict], params: Optional[dict] = None) -> list:
157        instance_id = self._get_obj_key(instance)
158        url = f"{self.url}/instances/{instance_id}/ipv4"
159        return self._req("get", url, params=params)["ipv4s"]
def create_ipv4(self, instance: Union[str, dict], **kwargs) -> dict:
161    def create_ipv4(self, instance: Union[str, dict], **kwargs) -> dict:
162        instance_id = self._get_obj_key(instance)
163        url = f"{self.url}/instances/{instance_id}/ipv4"
164        return self._req("post", url, kwargs)["ipv4"]
def delete_ipv4(self, instance: Union[str, dict]) -> None:
166    def delete_ipv4(self, instance: Union[str, dict]) -> None:
167        instance_id = self._get_obj_key(instance)
168        url = f"{self.url}/instances/{instance_id}/ipv4"
169        return self._req("delete", url)
@staticmethod
def filter_list(item_list: List[dict], value: str, key: str = 'name') -> dict:
171    @staticmethod
172    def filter_list(item_list: List[dict], value: str, key: str = "name") -> dict:
173        """
174        Helper Function to get an Item from a List of Dictionaries
175        :param item_list: List to filter
176        :param value: Value of the Key
177        :param key: Key to check for Value
178        :return: Item or {}
179        """
180        return next((d for d in item_list if str(d.get(key, "")).lower() == value.lower()), {})

Helper Function to get an Item from a List of Dictionaries

Parameters
  • item_list: List to filter
  • value: Value of the Key
  • key: Key to check for Value
Returns

Item or {}

@staticmethod
def filter_regions(regions: list, locations: list) -> list:
182    @staticmethod
183    def filter_regions(regions: list, locations: list) -> list:
184        return [d for d in regions if d["id"] in locations]
@staticmethod
def filter_keys(keys: list, name: str) -> dict:
186    @staticmethod
187    def filter_keys(keys: list, name: str) -> dict:
188        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
189        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
190        try:
191            return next(d for d in keys if d["name"].lower() == name.lower())
192        except StopIteration:
193            return {}

Soft Deprecated in 0.2.0. Use Vultr.filter_list()

@staticmethod
def filter_os(os_list: list, name: str) -> dict:
195    @staticmethod
196    def filter_os(os_list: list, name: str) -> dict:
197        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
198        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
199        try:
200            return next(d for d in os_list if d["name"].lower() == name.lower())
201        except StopIteration:
202            return {}

Soft Deprecated in 0.2.0. Use Vultr.filter_list()

@staticmethod
def filter_scripts(scripts: list, name: str) -> dict:
204    @staticmethod
205    def filter_scripts(scripts: list, name: str) -> dict:
206        """Soft Deprecated in 0.2.0. Use `Vultr.filter_list()`"""
207        warnings.warn("Soft Deprecated in 0.2.0. Use filter_list()", PendingDeprecationWarning, stacklevel=2)
208        try:
209            return next(d for d in scripts if d["name"].lower() == name.lower())
210        except StopIteration:
211            return {}

Soft Deprecated in 0.2.0. Use Vultr.filter_list()

class VultrException(builtins.Exception):
236class VultrException(Exception):
237    """Exception class for all Vultr error responses."""
238
239    def __init__(self, response: requests.Response):
240        self.status: int = response.status_code
241        """Response Status Code"""
242        try:
243            data = response.json()
244            error = data.get("error", response.text)
245        except requests.JSONDecodeError:
246            error = response.text
247        self.error: str = str(error)
248        """Error Message for 400 Codes"""
249        super().__init__(f"Error {self.status}: {self.error}")

Exception class for all Vultr error responses.

VultrException(response: requests.models.Response)
239    def __init__(self, response: requests.Response):
240        self.status: int = response.status_code
241        """Response Status Code"""
242        try:
243            data = response.json()
244            error = data.get("error", response.text)
245        except requests.JSONDecodeError:
246            error = response.text
247        self.error: str = str(error)
248        """Error Message for 400 Codes"""
249        super().__init__(f"Error {self.status}: {self.error}")
status: int

Response Status Code

error: str

Error Message for 400 Codes