tesla-fleet-api 0.0.4__py3-none-any.whl → 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tesla_fleet_api/__init__.py +3 -3
- tesla_fleet_api/charging.py +57 -0
- tesla_fleet_api/energy.py +130 -0
- tesla_fleet_api/exceptions.py +21 -21
- tesla_fleet_api/partner.py +21 -0
- tesla_fleet_api/teslafleetapi.py +116 -0
- tesla_fleet_api/{TeslaFleetOAuth.py → teslafleetoauth.py} +1 -1
- tesla_fleet_api/{Teslemetry.py → teslemetry.py} +18 -19
- tesla_fleet_api/user.py +29 -0
- tesla_fleet_api/vehicle.py +833 -0
- tesla_fleet_api/vehiclespecific.py +415 -0
- {tesla_fleet_api-0.0.4.dist-info → tesla_fleet_api-0.0.5.dist-info}/METADATA +1 -1
- tesla_fleet_api-0.0.5.dist-info/RECORD +17 -0
- tesla_fleet_api/TeslaFleetApi.py +0 -1490
- tesla_fleet_api-0.0.4.dist-info/RECORD +0 -11
- {tesla_fleet_api-0.0.4.dist-info → tesla_fleet_api-0.0.5.dist-info}/LICENSE +0 -0
- {tesla_fleet_api-0.0.4.dist-info → tesla_fleet_api-0.0.5.dist-info}/WHEEL +0 -0
- {tesla_fleet_api-0.0.4.dist-info → tesla_fleet_api-0.0.5.dist-info}/top_level.txt +0 -0
tesla_fleet_api/__init__.py
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
from .
|
2
|
-
from .
|
3
|
-
from .
|
1
|
+
from .teslafleetapi import TeslaFleetApi
|
2
|
+
from .teslafleetoauth import TeslaFleetOAuth
|
3
|
+
from .teslemetry import Teslemetry
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from .const import (
|
3
|
+
Methods,
|
4
|
+
)
|
5
|
+
|
6
|
+
|
7
|
+
class Charging:
|
8
|
+
"""Class describing the Tesla Fleet API charging endpoints."""
|
9
|
+
|
10
|
+
def __init__(self, parent):
|
11
|
+
self._request = parent._request
|
12
|
+
|
13
|
+
async def history(
|
14
|
+
self,
|
15
|
+
vin: str | None = None,
|
16
|
+
startTime: str | None = None,
|
17
|
+
endTime: str | None = None,
|
18
|
+
pageNo: int | None = None,
|
19
|
+
pageSize: int | None = None,
|
20
|
+
sortBy: str | None = None,
|
21
|
+
sortOrder: str | None = None,
|
22
|
+
) -> dict[str, Any]:
|
23
|
+
"""Returns the paginated charging history."""
|
24
|
+
return await self._request(
|
25
|
+
Methods.GET,
|
26
|
+
"api/1/dx/charging/history",
|
27
|
+
{
|
28
|
+
vin: vin,
|
29
|
+
startTime: startTime,
|
30
|
+
endTime: endTime,
|
31
|
+
pageNo: pageNo,
|
32
|
+
pageSize: pageSize,
|
33
|
+
sortBy: sortBy,
|
34
|
+
sortOrder: sortOrder,
|
35
|
+
},
|
36
|
+
)
|
37
|
+
|
38
|
+
async def sessions(
|
39
|
+
self,
|
40
|
+
vin: str | None = None,
|
41
|
+
date_from: str | None = None,
|
42
|
+
date_to: str | None = None,
|
43
|
+
limit: int | None = None,
|
44
|
+
offset: int | None = None,
|
45
|
+
) -> dict[str, Any]:
|
46
|
+
"""Returns the charging session information including pricing and energy data. This endpoint is only available for business accounts that own a fleet of vehicles."""
|
47
|
+
return await self._request(
|
48
|
+
Methods.GET,
|
49
|
+
"api/1/dx/charging/sessions",
|
50
|
+
{
|
51
|
+
vin: vin,
|
52
|
+
date_from: date_from,
|
53
|
+
date_to: date_to,
|
54
|
+
limit: limit,
|
55
|
+
offset: offset,
|
56
|
+
},
|
57
|
+
)
|
@@ -0,0 +1,130 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from .const import Methods
|
3
|
+
|
4
|
+
|
5
|
+
class Energy:
|
6
|
+
"""Class describing the Tesla Fleet API partner endpoints"""
|
7
|
+
|
8
|
+
def __init__(self, parent):
|
9
|
+
self._request = parent._request
|
10
|
+
|
11
|
+
async def backup(
|
12
|
+
self, energy_site_id: int, backup_reserve_percent: int
|
13
|
+
) -> dict[str, Any]:
|
14
|
+
"""Adjust the site's backup reserve."""
|
15
|
+
return await self._request(
|
16
|
+
Methods.POST,
|
17
|
+
f"api/1/energy_sites/{energy_site_id}/backup",
|
18
|
+
data={backup_reserve_percent: backup_reserve_percent},
|
19
|
+
)
|
20
|
+
|
21
|
+
async def backup_history(
|
22
|
+
self,
|
23
|
+
energy_site_id: int,
|
24
|
+
kind: str,
|
25
|
+
start_date: str,
|
26
|
+
end_date: str,
|
27
|
+
period: str,
|
28
|
+
time_zone: str,
|
29
|
+
) -> dict[str, Any]:
|
30
|
+
"""Returns the backup (off-grid) event history of the site in duration of seconds."""
|
31
|
+
return await self._request(
|
32
|
+
Methods.GET,
|
33
|
+
f"api/1/energy_sites/{energy_site_id}/calendar_history?kind={kind}&start_date={start_date}&end_date={end_date}&period={period}&time_zone={time_zone}",
|
34
|
+
)
|
35
|
+
|
36
|
+
async def charge_history(
|
37
|
+
self,
|
38
|
+
energy_site_id: int,
|
39
|
+
kind: str,
|
40
|
+
start_date: str,
|
41
|
+
end_date: str,
|
42
|
+
time_zone: str,
|
43
|
+
) -> dict[str, Any]:
|
44
|
+
"""Returns the charging history of a wall connector."""
|
45
|
+
return await self._request(
|
46
|
+
Methods.GET,
|
47
|
+
f"api/1/energy_sites/{energy_site_id}/telemetry_history?kind={kind}&start_date={start_date}&end_date={end_date}&time_zone={time_zone}",
|
48
|
+
)
|
49
|
+
|
50
|
+
async def energy_history(
|
51
|
+
self,
|
52
|
+
energy_site_id: int,
|
53
|
+
kind: str,
|
54
|
+
start_date: str,
|
55
|
+
end_date: str,
|
56
|
+
period: str,
|
57
|
+
time_zone: str,
|
58
|
+
) -> dict[str, Any]:
|
59
|
+
"""Returns the energy measurements of the site, aggregated to the requested period."""
|
60
|
+
return await self._request(
|
61
|
+
Methods.GET,
|
62
|
+
f"api/1/energy_sites/{energy_site_id}/calendar_history?kind={kind}&start_date={start_date}&end_date={end_date}&period={period}&time_zone={time_zone}",
|
63
|
+
)
|
64
|
+
|
65
|
+
async def grid_import_export(
|
66
|
+
self,
|
67
|
+
energy_site_id: int,
|
68
|
+
disallow_charge_from_grid_with_solar_installed: bool,
|
69
|
+
customer_preferred_export_rule: str,
|
70
|
+
) -> dict[str, Any]:
|
71
|
+
"""Allow/disallow charging from the grid and exporting energy to the grid."""
|
72
|
+
return await self._request(
|
73
|
+
Methods.POST,
|
74
|
+
f"api/1/energy_sites/{energy_site_id}/grid_import_export",
|
75
|
+
data={
|
76
|
+
disallow_charge_from_grid_with_solar_installed: disallow_charge_from_grid_with_solar_installed,
|
77
|
+
customer_preferred_export_rule: customer_preferred_export_rule,
|
78
|
+
},
|
79
|
+
)
|
80
|
+
|
81
|
+
async def live_status(self, energy_site_id: int) -> dict[str, Any]:
|
82
|
+
"""Returns the live status of the site (power, state of energy, grid status, storm mode)."""
|
83
|
+
return await self._request(
|
84
|
+
Methods.GET,
|
85
|
+
f"api/1/energy_sites/{energy_site_id}/live_status",
|
86
|
+
)
|
87
|
+
|
88
|
+
async def off_grid_vehicle_charging_reserve(
|
89
|
+
self, energy_site_id: int, off_grid_vehicle_charging_reserve_percent: int
|
90
|
+
) -> dict[str, Any]:
|
91
|
+
"""Adjust the site's off-grid vehicle charging backup reserve."""
|
92
|
+
return await self._request(
|
93
|
+
Methods.POST,
|
94
|
+
f"api/1/energy_sites/{energy_site_id}/off_grid_vehicle_charging_reserve",
|
95
|
+
data={
|
96
|
+
off_grid_vehicle_charging_reserve_percent: off_grid_vehicle_charging_reserve_percent
|
97
|
+
},
|
98
|
+
)
|
99
|
+
|
100
|
+
async def operation(
|
101
|
+
self, energy_site_id: int, default_real_mode: str
|
102
|
+
) -> dict[str, Any]:
|
103
|
+
"""Set the site's mode."""
|
104
|
+
return await self._request(
|
105
|
+
Methods.POST,
|
106
|
+
f"api/1/energy_sites/{energy_site_id}/operation",
|
107
|
+
data={default_real_mode: default_real_mode},
|
108
|
+
)
|
109
|
+
|
110
|
+
async def products(self) -> dict[str, Any]:
|
111
|
+
"""Returns products mapped to user."""
|
112
|
+
return await self._request(
|
113
|
+
Methods.GET,
|
114
|
+
"api/1/products",
|
115
|
+
)
|
116
|
+
|
117
|
+
async def site_info(self, energy_site_id: int) -> dict[str, Any]:
|
118
|
+
"""Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc)."""
|
119
|
+
return await self._request(
|
120
|
+
Methods.GET,
|
121
|
+
f"api/1/energy_sites/{energy_site_id}/site_info",
|
122
|
+
)
|
123
|
+
|
124
|
+
async def storm_mode(self, energy_site_id: int, enabled: bool) -> dict[str, Any]:
|
125
|
+
"""Update storm watch participation."""
|
126
|
+
return await self._request(
|
127
|
+
Methods.POST,
|
128
|
+
f"api/1/energy_sites/{energy_site_id}/storm_mode",
|
129
|
+
data={enabled: enabled},
|
130
|
+
)
|
tesla_fleet_api/exceptions.py
CHANGED
@@ -211,16 +211,16 @@ async def raise_for_status(resp: aiohttp.ClientResponse) -> None:
|
|
211
211
|
"""Raise an exception if the response status code is >=400."""
|
212
212
|
# https://developer.tesla.com/docs/fleet-api#response-codes
|
213
213
|
|
214
|
-
if
|
214
|
+
if resp.status == 401 and resp.content_length == 0:
|
215
215
|
# This error does not return a body
|
216
|
-
raise OAuthExpired()
|
216
|
+
raise OAuthExpired()
|
217
217
|
|
218
218
|
data = await resp.json()
|
219
219
|
|
220
220
|
try:
|
221
221
|
resp.raise_for_status()
|
222
222
|
except aiohttp.ClientResponseError as e:
|
223
|
-
if
|
223
|
+
if resp.status == 400:
|
224
224
|
if data.error == Errors.INVALID_COMMAND:
|
225
225
|
raise InvalidCommand(data) from e
|
226
226
|
elif data.error == Errors.INVALID_FIELD:
|
@@ -233,44 +233,44 @@ async def raise_for_status(resp: aiohttp.ClientResponse) -> None:
|
|
233
233
|
raise InvalidRedirectUrl(data) from e
|
234
234
|
elif data.error == Errors.UNAUTHORIZED_CLIENT:
|
235
235
|
raise UnauthorizedClient(data) from e
|
236
|
-
elif
|
236
|
+
elif resp.status == 401:
|
237
237
|
if data.error == Errors.MOBILE_ACCESS_DISABLED:
|
238
238
|
raise MobileAccessDisabled(data) from e
|
239
239
|
elif data.error == Errors.INVALID_TOKEN:
|
240
240
|
raise InvalidToken(data) from e
|
241
|
-
elif
|
241
|
+
elif resp.status == 402:
|
242
242
|
raise PaymentRequired(data) from e
|
243
|
-
elif
|
243
|
+
elif resp.status == 403:
|
244
244
|
raise Forbidden(data) from e
|
245
|
-
elif
|
245
|
+
elif resp.status == 404:
|
246
246
|
raise NotFound(data) from e
|
247
|
-
elif
|
247
|
+
elif resp.status == 405:
|
248
248
|
raise NotAllowed(data) from e
|
249
|
-
elif
|
249
|
+
elif resp.status == 406:
|
250
250
|
raise NotAcceptable(data) from e
|
251
|
-
elif
|
251
|
+
elif resp.status == 408:
|
252
252
|
raise VehicleOffline(data) from e
|
253
|
-
elif
|
253
|
+
elif resp.status == 412:
|
254
254
|
raise PreconditionFailed(data) from e
|
255
|
-
elif
|
255
|
+
elif resp.status == 421:
|
256
256
|
raise InvalidRegion(data) from e
|
257
|
-
elif
|
257
|
+
elif resp.status == 422:
|
258
258
|
raise InvalidResource(data) from e
|
259
|
-
elif
|
259
|
+
elif resp.status == 423:
|
260
260
|
raise Locked(data) from e
|
261
|
-
elif
|
261
|
+
elif resp.status == 429:
|
262
262
|
raise RateLimited(data) from e
|
263
|
-
elif
|
263
|
+
elif resp.status == 451:
|
264
264
|
raise ResourceUnavailableForLegalReasons(data) from e
|
265
|
-
elif
|
265
|
+
elif resp.status == 499:
|
266
266
|
raise ClientClosedRequest(data) from e
|
267
|
-
elif
|
267
|
+
elif resp.status == 500:
|
268
268
|
raise InternalServerError(data) from e
|
269
|
-
elif
|
269
|
+
elif resp.status == 503:
|
270
270
|
raise ServiceUnavailable(data) from e
|
271
|
-
elif
|
271
|
+
elif resp.status == 504:
|
272
272
|
raise GatewayTimeout(data) from e
|
273
|
-
elif
|
273
|
+
elif resp.status == 540:
|
274
274
|
raise DeviceUnexpectedResponse(data) from e
|
275
275
|
else:
|
276
276
|
raise e
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from .const import Methods
|
3
|
+
|
4
|
+
|
5
|
+
class Partner:
|
6
|
+
"""Class describing the Tesla Fleet API partner endpoints"""
|
7
|
+
|
8
|
+
def __init__(self, parent):
|
9
|
+
self._request = parent._request
|
10
|
+
|
11
|
+
async def public_key(self, domain: str | None = None) -> dict[str, Any]:
|
12
|
+
"""Returns the public key associated with a domain. It can be used to ensure the registration was successful."""
|
13
|
+
return await self._request(
|
14
|
+
Methods.GET, "api/1/partner_accounts/public_key", data={domain: domain}
|
15
|
+
)
|
16
|
+
|
17
|
+
async def register(self, domain: str) -> dict[str, Any]:
|
18
|
+
"""Registers an existing account before it can be used for general API access. Each application from developer.tesla.com must complete this step."""
|
19
|
+
return await self._request(
|
20
|
+
Methods.POST, "api/1/partner_accounts", data={domain: domain}
|
21
|
+
)
|
@@ -0,0 +1,116 @@
|
|
1
|
+
import aiohttp
|
2
|
+
from .exceptions import raise_for_status, InvalidRegion, LibraryError
|
3
|
+
from typing import Any
|
4
|
+
from .const import (
|
5
|
+
SERVERS,
|
6
|
+
Methods,
|
7
|
+
)
|
8
|
+
from .charging import Charging
|
9
|
+
from .energy import Energy
|
10
|
+
from .partner import Partner
|
11
|
+
from .user import User
|
12
|
+
from .vehicle import Vehicle
|
13
|
+
from .vehiclespecific import VehicleSpecific
|
14
|
+
|
15
|
+
|
16
|
+
# Based on https://developer.tesla.com/docs/fleet-api
|
17
|
+
class TeslaFleetApi:
|
18
|
+
"""Class describing the Tesla Fleet API."""
|
19
|
+
|
20
|
+
server: str
|
21
|
+
session: aiohttp.ClientSession
|
22
|
+
headers: dict[str, str]
|
23
|
+
raise_for_status: bool
|
24
|
+
vehicles: list[VehicleSpecific]
|
25
|
+
|
26
|
+
def __init__(
|
27
|
+
self,
|
28
|
+
session: aiohttp.ClientSession,
|
29
|
+
access_token: str,
|
30
|
+
use_command_protocol: bool = False,
|
31
|
+
region: str | None = None,
|
32
|
+
server: str | None = None,
|
33
|
+
raise_for_status: bool = True,
|
34
|
+
charging_scope: bool = True,
|
35
|
+
energy_scope: bool = True,
|
36
|
+
partner_scope: bool = True,
|
37
|
+
user_scope: bool = True,
|
38
|
+
vehicle_scope: bool = True,
|
39
|
+
):
|
40
|
+
"""Initialize the Tesla Fleet API."""
|
41
|
+
|
42
|
+
self.session = session
|
43
|
+
self.access_token = access_token
|
44
|
+
self.use_command_protocol = use_command_protocol
|
45
|
+
|
46
|
+
if region and not server and region not in SERVERS:
|
47
|
+
raise ValueError(f"Region must be one of {", ".join(SERVERS.keys())}")
|
48
|
+
self.server = server or SERVERS.get(region)
|
49
|
+
self.raise_for_status = raise_for_status
|
50
|
+
|
51
|
+
if charging_scope:
|
52
|
+
self.charging = Charging(self)
|
53
|
+
if energy_scope:
|
54
|
+
self.energy = Energy(self)
|
55
|
+
if user_scope:
|
56
|
+
self.user = User(self)
|
57
|
+
if partner_scope:
|
58
|
+
self.partner = Partner(self)
|
59
|
+
if vehicle_scope:
|
60
|
+
self.vehicle = Vehicle(self)
|
61
|
+
|
62
|
+
async def find_server(self) -> None:
|
63
|
+
"""Find the server URL for the Tesla Fleet API."""
|
64
|
+
for server in SERVERS.values():
|
65
|
+
self.server = server
|
66
|
+
try:
|
67
|
+
await self.user.region()
|
68
|
+
return
|
69
|
+
except InvalidRegion:
|
70
|
+
continue
|
71
|
+
raise LibraryError("Could not find a valid Tesla API server.")
|
72
|
+
|
73
|
+
async def _request(
|
74
|
+
self,
|
75
|
+
method: Methods,
|
76
|
+
path: str,
|
77
|
+
params: dict[str:Any] | None = None,
|
78
|
+
data: dict[str:Any] | None = None,
|
79
|
+
json: dict[str:Any] | None = None,
|
80
|
+
):
|
81
|
+
"""Send a request to the Tesla Fleet API."""
|
82
|
+
|
83
|
+
if not self.server:
|
84
|
+
raise ValueError("Server was not set at init. Call find_server() first.")
|
85
|
+
|
86
|
+
if method == Methods.GET and (data is not None or json is not None):
|
87
|
+
raise ValueError("GET requests cannot have data or json parameters.")
|
88
|
+
|
89
|
+
if params:
|
90
|
+
params = {k: v for k, v in params.items() if v is not None}
|
91
|
+
if data:
|
92
|
+
data = {k: v for k, v in data.items() if v is not None}
|
93
|
+
if json:
|
94
|
+
json = {k: v for k, v in json.items() if v is not None}
|
95
|
+
|
96
|
+
async with self.session.request(
|
97
|
+
method,
|
98
|
+
f"{self.server}/{path}",
|
99
|
+
headers={
|
100
|
+
"Authorization": f"Bearer {self.access_token}",
|
101
|
+
"Content-Type": "application/json",
|
102
|
+
},
|
103
|
+
data=data,
|
104
|
+
json=json,
|
105
|
+
params=params,
|
106
|
+
) as resp:
|
107
|
+
if self.raise_for_status:
|
108
|
+
await raise_for_status(resp)
|
109
|
+
return await resp.json()
|
110
|
+
|
111
|
+
async def status(self):
|
112
|
+
"""This endpoint returns the string "ok" if the API is operating normally. No HTTP headers are required."""
|
113
|
+
if not self.server:
|
114
|
+
raise ValueError("Server was not set at init. Call find_server() first.")
|
115
|
+
async with self.session.get(f"{self.server}/status") as resp:
|
116
|
+
return await resp.text()
|
@@ -1,14 +1,26 @@
|
|
1
1
|
import aiohttp
|
2
|
-
from .
|
2
|
+
from .teslafleetapi import TeslaFleetApi
|
3
|
+
from .vehicle import Vehicle
|
4
|
+
from .vehiclespecific import VehicleSpecific
|
3
5
|
from .const import Methods
|
4
6
|
|
5
7
|
|
8
|
+
class TeslemetryVehicle(Vehicle):
|
9
|
+
"""Tesla Fleet API Vehicle."""
|
10
|
+
|
11
|
+
async def create(self, only_subscribed=True) -> [VehicleSpecific]:
|
12
|
+
"""Creates a class for each vehicle."""
|
13
|
+
if only_subscribed:
|
14
|
+
return [VehicleSpecific(self, vin) for vin in await self._parent.vehicles()]
|
15
|
+
return await super().create()
|
16
|
+
|
17
|
+
|
6
18
|
class Teslemetry(TeslaFleetApi):
|
7
19
|
def __init__(
|
8
20
|
self,
|
9
21
|
session: aiohttp.ClientSession,
|
10
22
|
access_token: str,
|
11
|
-
raise_for_status: bool =
|
23
|
+
raise_for_status: bool = True,
|
12
24
|
):
|
13
25
|
"""Initialize the Teslemetry API."""
|
14
26
|
super().__init__(
|
@@ -17,7 +29,11 @@ class Teslemetry(TeslaFleetApi):
|
|
17
29
|
use_command_protocol=False,
|
18
30
|
server="https://teslemetry.com",
|
19
31
|
raise_for_status=raise_for_status,
|
32
|
+
partner_scope=False,
|
33
|
+
user_scope=False,
|
34
|
+
vehicle_scope=False,
|
20
35
|
)
|
36
|
+
self.vehicle = TeslemetryVehicle(self)
|
21
37
|
|
22
38
|
async def vehicles(self):
|
23
39
|
"""Get the subscribed vehicles."""
|
@@ -29,20 +45,3 @@ class Teslemetry(TeslaFleetApi):
|
|
29
45
|
async def find_server(self):
|
30
46
|
"""Find the server URL for the Tesla Fleet API."""
|
31
47
|
raise NotImplementedError("Do not use this function for Teslemetry.")
|
32
|
-
|
33
|
-
def stream(self, vin: str, fields, alerts, expire: int):
|
34
|
-
"""Stream data from the Tesla Fleet API."""
|
35
|
-
raise NotImplementedError("Not implemented yet")
|
36
|
-
|
37
|
-
class Vehicle(TeslaFleetApi.Vehicle):
|
38
|
-
"""Tesla Fleet API Vehicle."""
|
39
|
-
|
40
|
-
async def create(
|
41
|
-
self, only_subscribed=True
|
42
|
-
) -> [TeslaFleetApi.Vehicle.Specific]:
|
43
|
-
"""Creates a class for each vehicle."""
|
44
|
-
if only_subscribed:
|
45
|
-
return [
|
46
|
-
self.Specific(self, vin) for vin in await self._parent.vehicles()
|
47
|
-
]
|
48
|
-
return await super().create()
|
tesla_fleet_api/user.py
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from .const import Methods
|
3
|
+
|
4
|
+
|
5
|
+
class User:
|
6
|
+
"""Class describing the Tesla Fleet API user endpoints"""
|
7
|
+
|
8
|
+
def __init__(self, parent):
|
9
|
+
self._request = parent._request
|
10
|
+
|
11
|
+
async def backup_key(self) -> dict[str, Any]:
|
12
|
+
"""Returns the public key associated with the user."""
|
13
|
+
return await self._request(Methods.GET, "api/1/users/backup_key")
|
14
|
+
|
15
|
+
async def feature_config(self) -> dict[str, Any]:
|
16
|
+
"""Returns any custom feature flag applied to a user."""
|
17
|
+
return await self._request(Methods.GET, "api/1/users/feature_config")
|
18
|
+
|
19
|
+
async def me(self) -> dict[str, Any]:
|
20
|
+
"""Returns a summary of a user's account."""
|
21
|
+
return await self._request(Methods.GET, "api/1/users/me")
|
22
|
+
|
23
|
+
async def orders(self) -> dict[str, Any]:
|
24
|
+
"""Returns the active orders for a user."""
|
25
|
+
return await self._request(Methods.GET, "api/1/users/orders")
|
26
|
+
|
27
|
+
async def region(self) -> dict[str, Any]:
|
28
|
+
"""Returns a user's region and appropriate fleet-api base URL. Accepts no parameters, response is based on the authentication token subject."""
|
29
|
+
return await self._request(Methods.GET, "api/1/users/region")
|