htag-sdk 1.9.2__tar.gz → 1.9.4__tar.gz

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.
Files changed (62) hide show
  1. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/PKG-INFO +1 -1
  2. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/pyproject.toml +1 -1
  3. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/__init__.py +6 -0
  4. htag_sdk-1.9.4/src/htag_sdk/address/__init__.py +91 -0
  5. htag_sdk-1.9.4/src/htag_sdk/address/async_client.py +368 -0
  6. htag_sdk-1.9.4/src/htag_sdk/address/client.py +369 -0
  7. htag_sdk-1.9.4/src/htag_sdk/address/models.py +504 -0
  8. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/markets/models.py +1 -0
  9. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/property/__init__.py +6 -0
  10. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/property/async_client.py +21 -0
  11. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/property/client.py +29 -0
  12. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/property/models.py +40 -0
  13. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/reference/models.py +1 -0
  14. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_domains.py +34 -0
  15. htag_sdk-1.9.2/src/htag_sdk/address/__init__.py +0 -41
  16. htag_sdk-1.9.2/src/htag_sdk/address/async_client.py +0 -162
  17. htag_sdk-1.9.2/src/htag_sdk/address/client.py +0 -165
  18. htag_sdk-1.9.2/src/htag_sdk/address/models.py +0 -249
  19. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/.gitignore +0 -0
  20. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/README.md +0 -0
  21. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/_async_client.py +0 -0
  22. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/_base.py +0 -0
  23. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/_client.py +0 -0
  24. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/_exceptions.py +0 -0
  25. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/_types.py +0 -0
  26. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/agents/__init__.py +0 -0
  27. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/agents/async_client.py +0 -0
  28. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/agents/client.py +0 -0
  29. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/agents/models.py +0 -0
  30. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/demographics/__init__.py +0 -0
  31. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/demographics/async_client.py +0 -0
  32. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/demographics/client.py +0 -0
  33. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/demographics/models.py +0 -0
  34. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/economics/__init__.py +0 -0
  35. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/economics/async_client.py +0 -0
  36. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/economics/client.py +0 -0
  37. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/economics/models.py +0 -0
  38. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/intent_hub/__init__.py +0 -0
  39. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/intent_hub/async_client.py +0 -0
  40. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/intent_hub/client.py +0 -0
  41. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/intent_hub/models.py +0 -0
  42. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/internal/__init__.py +0 -0
  43. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/internal/async_client.py +0 -0
  44. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/internal/client.py +0 -0
  45. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/markets/__init__.py +0 -0
  46. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/markets/async_client.py +0 -0
  47. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/markets/client.py +0 -0
  48. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/py.typed +0 -0
  49. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/reference/__init__.py +0 -0
  50. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/reference/async_client.py +0 -0
  51. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/reference/client.py +0 -0
  52. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/spatial/__init__.py +0 -0
  53. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/spatial/async_client.py +0 -0
  54. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/spatial/client.py +0 -0
  55. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/src/htag_sdk/spatial/models.py +0 -0
  56. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/__init__.py +0 -0
  57. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_base.py +0 -0
  58. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_client.py +0 -0
  59. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_exceptions.py +0 -0
  60. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_models.py +0 -0
  61. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/tests/test_spatial_viewport.py +0 -0
  62. {htag_sdk-1.9.2 → htag_sdk-1.9.4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htag-sdk
3
- Version: 1.9.2
3
+ Version: 1.9.4
4
4
  Summary: Official Python SDK for the HtAG Location Intelligence API — address search, property data, and market analytics for Australia
5
5
  Project-URL: Homepage, https://developer.htagai.com
6
6
  Project-URL: Documentation, https://developer.htagai.com
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "htag-sdk"
7
- version = "1.9.2"
7
+ version = "1.9.4"
8
8
  description = "Official Python SDK for the HtAG Location Intelligence API — address search, property data, and market analytics for Australia"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -62,8 +62,11 @@ from htag_sdk.property.models import (
62
62
  PropertyAvmResponse,
63
63
  PropertyEstimatesRecord,
64
64
  PropertyEstimatesResponse,
65
+ PropertyHistoryResponse,
65
66
  PropertyMarketRecord,
66
67
  PropertyMarketResponse,
68
+ PropertyRentedHistoryRecord,
69
+ PropertySoldHistoryRecord,
67
70
  PropertySummaryRecord,
68
71
  PropertySummaryResponse,
69
72
  RentedPropertiesResponse,
@@ -233,8 +236,11 @@ __all__ = [
233
236
  "PropertyAvmResponse",
234
237
  "PropertyEstimatesRecord",
235
238
  "PropertyEstimatesResponse",
239
+ "PropertyHistoryResponse",
236
240
  "PropertyMarketRecord",
237
241
  "PropertyMarketResponse",
242
+ "PropertyRentedHistoryRecord",
243
+ "PropertySoldHistoryRecord",
238
244
  "PropertySummaryRecord",
239
245
  "PropertySummaryResponse",
240
246
  "RentedPropertiesResponse",
@@ -0,0 +1,91 @@
1
+ """Address API domain — search, insights, standardisation, geocode, environment, demographics, schools, features."""
2
+
3
+ from htag_sdk.address.async_client import AsyncAddressClient
4
+ from htag_sdk.address.client import AddressClient
5
+ from htag_sdk.address.models import (
6
+ AddressAmenitiesRecord,
7
+ AddressAmenitiesResponse,
8
+ AddressAviationRecord,
9
+ AddressAviationResponse,
10
+ AddressCbdProximityRecord,
11
+ AddressCbdProximityResponse,
12
+ AddressCoastalRecord,
13
+ AddressCoastalResponse,
14
+ AddressEssentialsRecord,
15
+ AddressEssentialsResponse,
16
+ AddressFeatureBaseRecord,
17
+ AddressGreenSpaceRecord,
18
+ AddressGreenSpaceResponse,
19
+ AddressHazardsRecord,
20
+ AddressHazardsResponse,
21
+ AddressInsightsResponse,
22
+ AddressNuisanceRecord,
23
+ AddressNuisanceResponse,
24
+ AddressRecord,
25
+ AddressRoadInfrastructureRecord,
26
+ AddressRoadInfrastructureResponse,
27
+ AddressSafetyRecord,
28
+ AddressSafetyResponse,
29
+ AddressSearchResponse,
30
+ AddressSearchResult,
31
+ AddressTransportRecord,
32
+ AddressTransportResponse,
33
+ AddressWalkabilityRecord,
34
+ AddressWalkabilityResponse,
35
+ AustralianAddressComponents,
36
+ BatchStandardiseResponse,
37
+ DemographicsRecord,
38
+ DemographicsResponse,
39
+ EnvironmentRecord,
40
+ EnvironmentResponse,
41
+ GeocodeRecord,
42
+ GeocodeResponse,
43
+ SchoolRecord,
44
+ SchoolsResponse,
45
+ StandardiseResult,
46
+ )
47
+
48
+ __all__ = [
49
+ "AddressClient",
50
+ "AsyncAddressClient",
51
+ "AddressAmenitiesRecord",
52
+ "AddressAmenitiesResponse",
53
+ "AddressAviationRecord",
54
+ "AddressAviationResponse",
55
+ "AddressCbdProximityRecord",
56
+ "AddressCbdProximityResponse",
57
+ "AddressCoastalRecord",
58
+ "AddressCoastalResponse",
59
+ "AddressEssentialsRecord",
60
+ "AddressEssentialsResponse",
61
+ "AddressFeatureBaseRecord",
62
+ "AddressGreenSpaceRecord",
63
+ "AddressGreenSpaceResponse",
64
+ "AddressHazardsRecord",
65
+ "AddressHazardsResponse",
66
+ "AddressInsightsResponse",
67
+ "AddressNuisanceRecord",
68
+ "AddressNuisanceResponse",
69
+ "AddressRecord",
70
+ "AddressRoadInfrastructureRecord",
71
+ "AddressRoadInfrastructureResponse",
72
+ "AddressSafetyRecord",
73
+ "AddressSafetyResponse",
74
+ "AddressSearchResponse",
75
+ "AddressSearchResult",
76
+ "AddressTransportRecord",
77
+ "AddressTransportResponse",
78
+ "AddressWalkabilityRecord",
79
+ "AddressWalkabilityResponse",
80
+ "AustralianAddressComponents",
81
+ "BatchStandardiseResponse",
82
+ "DemographicsRecord",
83
+ "DemographicsResponse",
84
+ "EnvironmentRecord",
85
+ "EnvironmentResponse",
86
+ "GeocodeRecord",
87
+ "GeocodeResponse",
88
+ "SchoolRecord",
89
+ "SchoolsResponse",
90
+ "StandardiseResult",
91
+ ]
@@ -0,0 +1,368 @@
1
+ """Asynchronous client for the Address API domain."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, List, Optional
6
+
7
+ from htag_sdk.address.models import (
8
+ AddressAmenitiesResponse,
9
+ AddressAviationResponse,
10
+ AddressCbdProximityResponse,
11
+ AddressCoastalResponse,
12
+ AddressEssentialsResponse,
13
+ AddressGreenSpaceResponse,
14
+ AddressHazardsResponse,
15
+ AddressNuisanceResponse,
16
+ AddressRoadInfrastructureResponse,
17
+ AddressSafetyResponse,
18
+ AddressTransportResponse,
19
+ AddressWalkabilityResponse,
20
+ BatchStandardiseResponse,
21
+ DemographicsResponse,
22
+ EnvironmentResponse,
23
+ GeocodeResponse,
24
+ SchoolsResponse,
25
+ )
26
+
27
+ if TYPE_CHECKING:
28
+ from htag_sdk._base import AsyncRequestMixin
29
+
30
+
31
+ class AsyncAddressClient:
32
+ """Asynchronous client for address search, insights, and standardisation.
33
+
34
+ This class is not instantiated directly. Access it via ``client.address``.
35
+ """
36
+
37
+ _client: "AsyncRequestMixin"
38
+
39
+ def __init__(self, client: "AsyncRequestMixin") -> None:
40
+ self._client = client
41
+
42
+ async def standardise(
43
+ self,
44
+ addresses: List[str],
45
+ ) -> BatchStandardiseResponse:
46
+ """Standardise a batch of free-text Australian addresses.
47
+
48
+ Args:
49
+ addresses: List of address strings to standardise (max 50).
50
+
51
+ Returns:
52
+ A :class:`BatchStandardiseResponse` with standardised components
53
+ for each input address.
54
+ """
55
+ data = await self._client._request(
56
+ "POST",
57
+ "/address/standardise",
58
+ json={"addresses": addresses},
59
+ )
60
+ return BatchStandardiseResponse.model_validate(data)
61
+
62
+ async def geocode(
63
+ self,
64
+ address: str,
65
+ *,
66
+ mb_category_2021: Optional[List[str]] = None,
67
+ limit: int = 10,
68
+ ) -> GeocodeResponse:
69
+ """Geocode an address to geographic identifiers.
70
+
71
+ Args:
72
+ address: Free-text address string (3-200 characters).
73
+ mb_category_2021: Mesh-block category filter.
74
+ limit: Maximum number of results (1-50).
75
+
76
+ Returns:
77
+ A :class:`GeocodeResponse` with geocoded address records.
78
+ """
79
+ params = {
80
+ "address": address,
81
+ "mb_category_2021": mb_category_2021,
82
+ "limit": limit,
83
+ }
84
+ data = await self._client._request("GET", "/address/geocode", params=params)
85
+ return GeocodeResponse.model_validate(data)
86
+
87
+ async def environment(
88
+ self,
89
+ *,
90
+ address: Optional[str] = None,
91
+ address_keys: Optional[List[str]] = None,
92
+ legal_parcel_id: Optional[str] = None,
93
+ mb_category_2021: Optional[List[str]] = None,
94
+ ) -> EnvironmentResponse:
95
+ """Retrieve environmental risk data for an address.
96
+
97
+ Exactly one of ``address``, ``address_keys``, or ``legal_parcel_id``
98
+ must be provided.
99
+
100
+ Args:
101
+ address: Full address string to look up.
102
+ address_keys: One or more GNAF address keys.
103
+ legal_parcel_id: Legal parcel identifier.
104
+ mb_category_2021: Mesh-block category filter.
105
+
106
+ Returns:
107
+ An :class:`EnvironmentResponse` with environment records.
108
+ """
109
+ params = {
110
+ "address": address,
111
+ "address_keys": address_keys,
112
+ "legal_parcel_id": legal_parcel_id,
113
+ "mb_category_2021": mb_category_2021,
114
+ }
115
+ data = await self._client._request("GET", "/address/environment", params=params)
116
+ return EnvironmentResponse.model_validate(data)
117
+
118
+ async def demographics(
119
+ self,
120
+ *,
121
+ address: Optional[str] = None,
122
+ address_keys: Optional[List[str]] = None,
123
+ legal_parcel_id: Optional[str] = None,
124
+ mb_category_2021: Optional[List[str]] = None,
125
+ ) -> DemographicsResponse:
126
+ """Retrieve demographic indices for an address.
127
+
128
+ Exactly one of ``address``, ``address_keys``, or ``legal_parcel_id``
129
+ must be provided.
130
+
131
+ Args:
132
+ address: Full address string to look up.
133
+ address_keys: One or more GNAF address keys.
134
+ legal_parcel_id: Legal parcel identifier.
135
+ mb_category_2021: Mesh-block category filter.
136
+
137
+ Returns:
138
+ A :class:`DemographicsResponse` with demographic records.
139
+ """
140
+ params = {
141
+ "address": address,
142
+ "address_keys": address_keys,
143
+ "legal_parcel_id": legal_parcel_id,
144
+ "mb_category_2021": mb_category_2021,
145
+ }
146
+ data = await self._client._request("GET", "/address/demographics", params=params)
147
+ return DemographicsResponse.model_validate(data)
148
+
149
+ async def schools(
150
+ self,
151
+ *,
152
+ address: Optional[str] = None,
153
+ address_key: Optional[str] = None,
154
+ radius_m: Optional[int] = None,
155
+ ) -> SchoolsResponse:
156
+ """Retrieve schools relevant to an address.
157
+
158
+ Exactly one of ``address`` or ``address_key`` must be provided.
159
+
160
+ Args:
161
+ address: Full address string to look up.
162
+ address_key: Canonical HTAG address key.
163
+ radius_m: Search radius in metres for Catholic/Independent schools (1000–50000).
164
+
165
+ Returns:
166
+ A :class:`SchoolsResponse` with school records.
167
+ """
168
+ params = {
169
+ "address": address,
170
+ "address_key": address_key,
171
+ "radius_m": radius_m,
172
+ }
173
+ data = await self._client._request("GET", "/address/schools", params=params)
174
+ return SchoolsResponse.model_validate(data)
175
+
176
+ async def walkability(
177
+ self,
178
+ address_keys: List[str],
179
+ ) -> AddressWalkabilityResponse:
180
+ """Retrieve walkability indicators for addresses.
181
+
182
+ Args:
183
+ address_keys: One or more canonical HTAG address keys (max 50).
184
+
185
+ Returns:
186
+ An :class:`AddressWalkabilityResponse` with walkability records.
187
+ """
188
+ params = {"address_keys": ",".join(address_keys)}
189
+ data = await self._client._request("GET", "/address/walkability", params=params)
190
+ return AddressWalkabilityResponse.model_validate(data)
191
+
192
+ async def transport(
193
+ self,
194
+ address_keys: List[str],
195
+ ) -> AddressTransportResponse:
196
+ """Retrieve public transport proximity for addresses.
197
+
198
+ Args:
199
+ address_keys: One or more canonical HTAG address keys (max 50).
200
+
201
+ Returns:
202
+ An :class:`AddressTransportResponse` with transport records.
203
+ """
204
+ params = {"address_keys": ",".join(address_keys)}
205
+ data = await self._client._request("GET", "/address/transport", params=params)
206
+ return AddressTransportResponse.model_validate(data)
207
+
208
+ async def cbd_proximity(
209
+ self,
210
+ address_keys: List[str],
211
+ ) -> AddressCbdProximityResponse:
212
+ """Retrieve CBD and major road proximity for addresses.
213
+
214
+ Args:
215
+ address_keys: One or more canonical HTAG address keys (max 50).
216
+
217
+ Returns:
218
+ An :class:`AddressCbdProximityResponse` with CBD proximity records.
219
+ """
220
+ params = {"address_keys": ",".join(address_keys)}
221
+ data = await self._client._request("GET", "/address/cbd-proximity", params=params)
222
+ return AddressCbdProximityResponse.model_validate(data)
223
+
224
+ async def coastal(
225
+ self,
226
+ address_keys: List[str],
227
+ ) -> AddressCoastalResponse:
228
+ """Retrieve coastal and waterfront proximity for addresses.
229
+
230
+ Args:
231
+ address_keys: One or more canonical HTAG address keys (max 50).
232
+
233
+ Returns:
234
+ An :class:`AddressCoastalResponse` with coastal records.
235
+ """
236
+ params = {"address_keys": ",".join(address_keys)}
237
+ data = await self._client._request("GET", "/address/coastal", params=params)
238
+ return AddressCoastalResponse.model_validate(data)
239
+
240
+ async def green_space(
241
+ self,
242
+ address_keys: List[str],
243
+ ) -> AddressGreenSpaceResponse:
244
+ """Retrieve parks and recreation proximity for addresses.
245
+
246
+ Args:
247
+ address_keys: One or more canonical HTAG address keys (max 50).
248
+
249
+ Returns:
250
+ An :class:`AddressGreenSpaceResponse` with green space records.
251
+ """
252
+ params = {"address_keys": ",".join(address_keys)}
253
+ data = await self._client._request("GET", "/address/green-space", params=params)
254
+ return AddressGreenSpaceResponse.model_validate(data)
255
+
256
+ async def amenities(
257
+ self,
258
+ address_keys: List[str],
259
+ ) -> AddressAmenitiesResponse:
260
+ """Retrieve lifestyle amenity proximity for addresses.
261
+
262
+ Args:
263
+ address_keys: One or more canonical HTAG address keys (max 50).
264
+
265
+ Returns:
266
+ An :class:`AddressAmenitiesResponse` with amenity records.
267
+ """
268
+ params = {"address_keys": ",".join(address_keys)}
269
+ data = await self._client._request("GET", "/address/amenities", params=params)
270
+ return AddressAmenitiesResponse.model_validate(data)
271
+
272
+ async def essentials(
273
+ self,
274
+ address_keys: List[str],
275
+ ) -> AddressEssentialsResponse:
276
+ """Retrieve essential services proximity for addresses.
277
+
278
+ Args:
279
+ address_keys: One or more canonical HTAG address keys (max 50).
280
+
281
+ Returns:
282
+ An :class:`AddressEssentialsResponse` with essential services records.
283
+ """
284
+ params = {"address_keys": ",".join(address_keys)}
285
+ data = await self._client._request("GET", "/address/essentials", params=params)
286
+ return AddressEssentialsResponse.model_validate(data)
287
+
288
+ async def hazards(
289
+ self,
290
+ address_keys: List[str],
291
+ ) -> AddressHazardsResponse:
292
+ """Retrieve hazard proximity indicators for addresses.
293
+
294
+ Args:
295
+ address_keys: One or more canonical HTAG address keys (max 50).
296
+
297
+ Returns:
298
+ An :class:`AddressHazardsResponse` with hazard records.
299
+ """
300
+ params = {"address_keys": ",".join(address_keys)}
301
+ data = await self._client._request("GET", "/address/hazards", params=params)
302
+ return AddressHazardsResponse.model_validate(data)
303
+
304
+ async def nuisance(
305
+ self,
306
+ address_keys: List[str],
307
+ ) -> AddressNuisanceResponse:
308
+ """Retrieve nuisance proximity indicators for addresses.
309
+
310
+ Args:
311
+ address_keys: One or more canonical HTAG address keys (max 50).
312
+
313
+ Returns:
314
+ An :class:`AddressNuisanceResponse` with nuisance records.
315
+ """
316
+ params = {"address_keys": ",".join(address_keys)}
317
+ data = await self._client._request("GET", "/address/nuisance", params=params)
318
+ return AddressNuisanceResponse.model_validate(data)
319
+
320
+ async def safety(
321
+ self,
322
+ address_keys: List[str],
323
+ ) -> AddressSafetyResponse:
324
+ """Retrieve emergency services proximity for addresses.
325
+
326
+ Args:
327
+ address_keys: One or more canonical HTAG address keys (max 50).
328
+
329
+ Returns:
330
+ An :class:`AddressSafetyResponse` with safety records.
331
+ """
332
+ params = {"address_keys": ",".join(address_keys)}
333
+ data = await self._client._request("GET", "/address/safety", params=params)
334
+ return AddressSafetyResponse.model_validate(data)
335
+
336
+ async def aviation(
337
+ self,
338
+ address_keys: List[str],
339
+ ) -> AddressAviationResponse:
340
+ """Retrieve aviation flight path indicators for addresses.
341
+
342
+ Args:
343
+ address_keys: One or more canonical HTAG address keys (max 50).
344
+
345
+ Returns:
346
+ An :class:`AddressAviationResponse` with aviation records.
347
+ """
348
+ params = {"address_keys": ",".join(address_keys)}
349
+ data = await self._client._request("GET", "/address/aviation", params=params)
350
+ return AddressAviationResponse.model_validate(data)
351
+
352
+ async def road_infrastructure(
353
+ self,
354
+ address_keys: List[str],
355
+ ) -> AddressRoadInfrastructureResponse:
356
+ """Retrieve road infrastructure indicators for addresses.
357
+
358
+ Args:
359
+ address_keys: One or more canonical HTAG address keys (max 50).
360
+
361
+ Returns:
362
+ An :class:`AddressRoadInfrastructureResponse` with road infrastructure records.
363
+ """
364
+ params = {"address_keys": ",".join(address_keys)}
365
+ data = await self._client._request(
366
+ "GET", "/address/road-infrastructure", params=params
367
+ )
368
+ return AddressRoadInfrastructureResponse.model_validate(data)