permitstack 1.0.0__tar.gz → 1.0.1__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 (76) hide show
  1. {permitstack-1.0.0 → permitstack-1.0.1}/PKG-INFO +14 -12
  2. {permitstack-1.0.0 → permitstack-1.0.1}/README.md +11 -9
  3. {permitstack-1.0.0 → permitstack-1.0.1}/pyproject.toml +3 -3
  4. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/_version.py +3 -3
  5. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/health.py +166 -0
  6. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/__init__.py +18 -11
  7. permitstack-1.0.1/src/permitstack/models/export_permitsop.py +180 -0
  8. permitstack-1.0.1/src/permitstack/models/get_webhook_secretop.py +16 -0
  9. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/search_permitsop.py +14 -5
  10. permitstack-1.0.1/src/permitstack/models/test_webhookop.py +20 -0
  11. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/permits.py +288 -8
  12. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/sdk.py +9 -9
  13. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/webhooks.py +390 -0
  14. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack.egg-info/PKG-INFO +14 -12
  15. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack.egg-info/SOURCES.txt +3 -3
  16. permitstack-1.0.0/src/permitstack/bulk_export.py +0 -241
  17. permitstack-1.0.0/src/permitstack/models/export_permits_csvop.py +0 -98
  18. permitstack-1.0.0/src/permitstack/models/permitcategory.py +0 -27
  19. {permitstack-1.0.0 → permitstack-1.0.1}/setup.cfg +0 -0
  20. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/__init__.py +0 -0
  21. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/_hooks/__init__.py +0 -0
  22. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/_hooks/sdkhooks.py +0 -0
  23. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/_hooks/types.py +0 -0
  24. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/basesdk.py +0 -0
  25. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/contractors.py +0 -0
  26. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/__init__.py +0 -0
  27. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/httpvalidationerror.py +0 -0
  28. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/no_response_error.py +0 -0
  29. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/permitstackdefaulterror.py +0 -0
  30. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/permitstackerror.py +0 -0
  31. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/errors/responsevalidationerror.py +0 -0
  32. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/httpclient.py +0 -0
  33. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/contractorprofile.py +0 -0
  34. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/contractorsearchresponse.py +0 -0
  35. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/contractorsummary.py +0 -0
  36. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/delete_webhookop.py +0 -0
  37. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/get_contractor_permitsop.py +0 -0
  38. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/get_contractorop.py +0 -0
  39. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/get_permitop.py +0 -0
  40. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/get_permits_by_addressop.py +0 -0
  41. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/get_property_historyop.py +0 -0
  42. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/permitdetail.py +0 -0
  43. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/permitsearchresponse.py +0 -0
  44. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/permitstatus.py +0 -0
  45. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/permitsummary.py +0 -0
  46. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/propertytype.py +0 -0
  47. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/search_contractorsop.py +0 -0
  48. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/security.py +0 -0
  49. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/validationerror.py +0 -0
  50. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/models/webhookcreate.py +0 -0
  51. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/property_history.py +0 -0
  52. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/py.typed +0 -0
  53. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/sdkconfiguration.py +0 -0
  54. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/types/__init__.py +0 -0
  55. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/types/basemodel.py +0 -0
  56. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/__init__.py +0 -0
  57. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/annotations.py +0 -0
  58. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/datetimes.py +0 -0
  59. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/dynamic_imports.py +0 -0
  60. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/enums.py +0 -0
  61. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/eventstreaming.py +0 -0
  62. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/forms.py +0 -0
  63. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/headers.py +0 -0
  64. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/logger.py +0 -0
  65. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/metadata.py +0 -0
  66. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/queryparams.py +0 -0
  67. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/requestbodies.py +0 -0
  68. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/retries.py +0 -0
  69. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/security.py +0 -0
  70. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/serializers.py +0 -0
  71. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/unmarshal_json_response.py +0 -0
  72. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/url.py +0 -0
  73. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack/utils/values.py +0 -0
  74. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack.egg-info/dependency_links.txt +0 -0
  75. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack.egg-info/requires.txt +0 -0
  76. {permitstack-1.0.0 → permitstack-1.0.1}/src/permitstack.egg-info/top_level.txt +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: permitstack
3
- Version: 1.0.0
4
- Summary: Official Python SDK for the PermitStack building permit data API. Search 15.6M+ US building permits across 54 cities.
5
- Author-email: PermitStack <support@aisaasfactory.io>
3
+ Version: 1.0.1
4
+ Summary: Official Python SDK for the PermitStack building permit data API.
5
+ Author: PermitStack
6
6
  License: Apache-2.0
7
7
  Requires-Python: >=3.10
8
8
  Description-Content-Type: text/markdown
@@ -25,23 +25,25 @@ Developer-friendly & type-safe Python SDK specifically catered to leverage *perm
25
25
  PermitStack:
26
26
  ## PermitStack Building Permit API
27
27
 
28
- Access 15.59M+ building permits across 54 U.S. cities and counties, updated daily from official open data portals.
28
+ Access 33M+ building permits across 145 active U.S. jurisdictions (plus 16 historical archives), updated daily from official open data portals.
29
29
 
30
30
  ### Getting started
31
- 1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (1,000 req/day)
31
+ 1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (100 req/day)
32
32
  2. Pass your key as `X-API-Key` header on every request
33
33
  3. See the `/v1/permits/search` endpoint to get started
34
34
 
35
35
  ### Rate limits
36
36
  Tier | Requests/min | Requests/day
37
37
  -----------|--------------|-------------
38
- Free | 30 | 1,000
38
+ Free | 30 | 100
39
+ Indie | 30 | 1,000
40
+ Hobbyist | 30 | 2,500
39
41
  Developer | 60 | 10,000
40
42
  Startup | 200 | 100,000
41
43
  Growth | 500 | 500,000
42
44
 
43
45
  ### Support
44
- support@aisaasfactory.io
46
+ support@permit-stack.com
45
47
  <!-- End Summary [summary] -->
46
48
 
47
49
  <!-- Start Table of Contents [toc] -->
@@ -227,10 +229,6 @@ with Permitstack(
227
229
  <details open>
228
230
  <summary>Available methods</summary>
229
231
 
230
- ### [BulkExport](docs/sdks/bulkexport/README.md)
231
-
232
- * [export_permits_csv](docs/sdks/bulkexport/README.md#export_permits_csv) - Export Permits Csv
233
-
234
232
  ### [Contractors](docs/sdks/contractors/README.md)
235
233
 
236
234
  * [search_contractors](docs/sdks/contractors/README.md#search_contractors) - Search Contractors
@@ -240,10 +238,12 @@ with Permitstack(
240
238
  ### [Health](docs/sdks/health/README.md)
241
239
 
242
240
  * [health_check](docs/sdks/health/README.md#health_check) - Health Check
241
+ * [public_stats](docs/sdks/health/README.md#public_stats) - Public Stats
243
242
 
244
243
  ### [Permits](docs/sdks/permits/README.md)
245
244
 
246
245
  * [search_permits](docs/sdks/permits/README.md#search_permits) - Search Permits
246
+ * [export_permits](docs/sdks/permits/README.md#export_permits) - Export Permits
247
247
  * [get_permit](docs/sdks/permits/README.md#get_permit) - Get Permit
248
248
  * [get_permits_by_address](docs/sdks/permits/README.md#get_permits_by_address) - Get Permits By Address
249
249
  * [get_coverage_stats](docs/sdks/permits/README.md#get_coverage_stats) - Get Coverage Stats
@@ -257,6 +257,8 @@ with Permitstack(
257
257
  * [list_webhooks](docs/sdks/webhooks/README.md#list_webhooks) - List Webhooks
258
258
  * [create_webhook](docs/sdks/webhooks/README.md#create_webhook) - Create Webhook
259
259
  * [delete_webhook](docs/sdks/webhooks/README.md#delete_webhook) - Delete Webhook
260
+ * [test_webhook](docs/sdks/webhooks/README.md#test_webhook) - Test Webhook
261
+ * [get_webhook_secret](docs/sdks/webhooks/README.md#get_webhook_secret) - Get Webhook Secret
260
262
 
261
263
  </details>
262
264
  <!-- End Available Resources and Operations [operations] -->
@@ -365,7 +367,7 @@ with Permitstack(
365
367
 
366
368
 
367
369
  **Inherit from [`PermitstackError`](./src/permitstack/errors/permitstackerror.py)**:
368
- * [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 10 of 13 methods.*
370
+ * [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 12 of 16 methods.*
369
371
  * [`ResponseValidationError`](./src/permitstack/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute.
370
372
 
371
373
  </details>
@@ -13,23 +13,25 @@ Developer-friendly & type-safe Python SDK specifically catered to leverage *perm
13
13
  PermitStack:
14
14
  ## PermitStack Building Permit API
15
15
 
16
- Access 15.59M+ building permits across 54 U.S. cities and counties, updated daily from official open data portals.
16
+ Access 33M+ building permits across 145 active U.S. jurisdictions (plus 16 historical archives), updated daily from official open data portals.
17
17
 
18
18
  ### Getting started
19
- 1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (1,000 req/day)
19
+ 1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (100 req/day)
20
20
  2. Pass your key as `X-API-Key` header on every request
21
21
  3. See the `/v1/permits/search` endpoint to get started
22
22
 
23
23
  ### Rate limits
24
24
  Tier | Requests/min | Requests/day
25
25
  -----------|--------------|-------------
26
- Free | 30 | 1,000
26
+ Free | 30 | 100
27
+ Indie | 30 | 1,000
28
+ Hobbyist | 30 | 2,500
27
29
  Developer | 60 | 10,000
28
30
  Startup | 200 | 100,000
29
31
  Growth | 500 | 500,000
30
32
 
31
33
  ### Support
32
- support@aisaasfactory.io
34
+ support@permit-stack.com
33
35
  <!-- End Summary [summary] -->
34
36
 
35
37
  <!-- Start Table of Contents [toc] -->
@@ -215,10 +217,6 @@ with Permitstack(
215
217
  <details open>
216
218
  <summary>Available methods</summary>
217
219
 
218
- ### [BulkExport](docs/sdks/bulkexport/README.md)
219
-
220
- * [export_permits_csv](docs/sdks/bulkexport/README.md#export_permits_csv) - Export Permits Csv
221
-
222
220
  ### [Contractors](docs/sdks/contractors/README.md)
223
221
 
224
222
  * [search_contractors](docs/sdks/contractors/README.md#search_contractors) - Search Contractors
@@ -228,10 +226,12 @@ with Permitstack(
228
226
  ### [Health](docs/sdks/health/README.md)
229
227
 
230
228
  * [health_check](docs/sdks/health/README.md#health_check) - Health Check
229
+ * [public_stats](docs/sdks/health/README.md#public_stats) - Public Stats
231
230
 
232
231
  ### [Permits](docs/sdks/permits/README.md)
233
232
 
234
233
  * [search_permits](docs/sdks/permits/README.md#search_permits) - Search Permits
234
+ * [export_permits](docs/sdks/permits/README.md#export_permits) - Export Permits
235
235
  * [get_permit](docs/sdks/permits/README.md#get_permit) - Get Permit
236
236
  * [get_permits_by_address](docs/sdks/permits/README.md#get_permits_by_address) - Get Permits By Address
237
237
  * [get_coverage_stats](docs/sdks/permits/README.md#get_coverage_stats) - Get Coverage Stats
@@ -245,6 +245,8 @@ with Permitstack(
245
245
  * [list_webhooks](docs/sdks/webhooks/README.md#list_webhooks) - List Webhooks
246
246
  * [create_webhook](docs/sdks/webhooks/README.md#create_webhook) - Create Webhook
247
247
  * [delete_webhook](docs/sdks/webhooks/README.md#delete_webhook) - Delete Webhook
248
+ * [test_webhook](docs/sdks/webhooks/README.md#test_webhook) - Test Webhook
249
+ * [get_webhook_secret](docs/sdks/webhooks/README.md#get_webhook_secret) - Get Webhook Secret
248
250
 
249
251
  </details>
250
252
  <!-- End Available Resources and Operations [operations] -->
@@ -353,7 +355,7 @@ with Permitstack(
353
355
 
354
356
 
355
357
  **Inherit from [`PermitstackError`](./src/permitstack/errors/permitstackerror.py)**:
356
- * [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 10 of 13 methods.*
358
+ * [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 12 of 16 methods.*
357
359
  * [`ResponseValidationError`](./src/permitstack/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute.
358
360
 
359
361
  </details>
@@ -1,8 +1,8 @@
1
1
  [project]
2
2
  name = "permitstack"
3
- version = "1.0.0"
4
- description = "Official Python SDK for the PermitStack building permit data API. Search 15.6M+ US building permits across 54 cities."
5
- authors = [{ name = "PermitStack", email = "support@aisaasfactory.io" },]
3
+ version = "1.0.1"
4
+ description = "Official Python SDK for the PermitStack building permit data API."
5
+ authors = [{ name = "PermitStack" },]
6
6
  readme = "README.md"
7
7
  requires-python = ">=3.10"
8
8
  dependencies = [
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "permitstack"
6
- __version__: str = "1.0.0"
6
+ __version__: str = "1.0.1"
7
7
  __openapi_doc_version__: str = "1.0.0"
8
- __gen_version__: str = "2.881.2"
9
- __user_agent__: str = "speakeasy-sdk/python 1.0.0 2.881.2 1.0.0 permitstack"
8
+ __gen_version__: str = "2.884.11"
9
+ __user_agent__: str = "speakeasy-sdk/python 1.0.1 2.884.11 1.0.0 permitstack"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -169,3 +169,169 @@ class Health(BaseSDK):
169
169
  )
170
170
 
171
171
  raise errors.PermitstackDefaultError("Unexpected response received", http_res)
172
+
173
+ def public_stats(
174
+ self,
175
+ *,
176
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
177
+ server_url: Optional[str] = None,
178
+ timeout_ms: Optional[int] = None,
179
+ http_headers: Optional[Mapping[str, str]] = None,
180
+ ) -> Any:
181
+ r"""Public Stats
182
+
183
+ Public stats endpoint — no auth required.
184
+ Returns aggregate coverage numbers for marketing/transparency.
185
+ Cached server-side for 5 minutes.
186
+
187
+ :param retries: Override the default retry configuration for this method
188
+ :param server_url: Override the default server URL for this method
189
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
190
+ :param http_headers: Additional headers to set or replace on requests.
191
+ """
192
+ base_url = None
193
+ url_variables = None
194
+ if timeout_ms is None:
195
+ timeout_ms = self.sdk_configuration.timeout_ms
196
+
197
+ if server_url is not None:
198
+ base_url = server_url
199
+ else:
200
+ base_url = self._get_url(base_url, url_variables)
201
+ req = self._build_request(
202
+ method="GET",
203
+ path="/stats",
204
+ base_url=base_url,
205
+ url_variables=url_variables,
206
+ request=None,
207
+ request_body_required=False,
208
+ request_has_path_params=False,
209
+ request_has_query_params=True,
210
+ user_agent_header="user-agent",
211
+ accept_header_value="application/json",
212
+ http_headers=http_headers,
213
+ security=self.sdk_configuration.security,
214
+ allow_empty_value=None,
215
+ timeout_ms=timeout_ms,
216
+ )
217
+
218
+ if retries == UNSET:
219
+ if self.sdk_configuration.retry_config is not UNSET:
220
+ retries = self.sdk_configuration.retry_config
221
+
222
+ retry_config = None
223
+ if isinstance(retries, utils.RetryConfig):
224
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
225
+
226
+ http_res = self.do_request(
227
+ hook_ctx=HookContext(
228
+ config=self.sdk_configuration,
229
+ base_url=base_url or "",
230
+ operation_id="public_stats",
231
+ oauth2_scopes=None,
232
+ security_source=get_security_from_env(
233
+ self.sdk_configuration.security, models.Security
234
+ ),
235
+ ),
236
+ request=req,
237
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
238
+ retry_config=retry_config,
239
+ )
240
+
241
+ if utils.match_response(http_res, "200", "application/json"):
242
+ return unmarshal_json_response(Any, http_res)
243
+ if utils.match_response(http_res, "4XX", "*"):
244
+ http_res_text = utils.stream_to_text(http_res)
245
+ raise errors.PermitstackDefaultError(
246
+ "API error occurred", http_res, http_res_text
247
+ )
248
+ if utils.match_response(http_res, "5XX", "*"):
249
+ http_res_text = utils.stream_to_text(http_res)
250
+ raise errors.PermitstackDefaultError(
251
+ "API error occurred", http_res, http_res_text
252
+ )
253
+
254
+ raise errors.PermitstackDefaultError("Unexpected response received", http_res)
255
+
256
+ async def public_stats_async(
257
+ self,
258
+ *,
259
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
260
+ server_url: Optional[str] = None,
261
+ timeout_ms: Optional[int] = None,
262
+ http_headers: Optional[Mapping[str, str]] = None,
263
+ ) -> Any:
264
+ r"""Public Stats
265
+
266
+ Public stats endpoint — no auth required.
267
+ Returns aggregate coverage numbers for marketing/transparency.
268
+ Cached server-side for 5 minutes.
269
+
270
+ :param retries: Override the default retry configuration for this method
271
+ :param server_url: Override the default server URL for this method
272
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
273
+ :param http_headers: Additional headers to set or replace on requests.
274
+ """
275
+ base_url = None
276
+ url_variables = None
277
+ if timeout_ms is None:
278
+ timeout_ms = self.sdk_configuration.timeout_ms
279
+
280
+ if server_url is not None:
281
+ base_url = server_url
282
+ else:
283
+ base_url = self._get_url(base_url, url_variables)
284
+ req = self._build_request_async(
285
+ method="GET",
286
+ path="/stats",
287
+ base_url=base_url,
288
+ url_variables=url_variables,
289
+ request=None,
290
+ request_body_required=False,
291
+ request_has_path_params=False,
292
+ request_has_query_params=True,
293
+ user_agent_header="user-agent",
294
+ accept_header_value="application/json",
295
+ http_headers=http_headers,
296
+ security=self.sdk_configuration.security,
297
+ allow_empty_value=None,
298
+ timeout_ms=timeout_ms,
299
+ )
300
+
301
+ if retries == UNSET:
302
+ if self.sdk_configuration.retry_config is not UNSET:
303
+ retries = self.sdk_configuration.retry_config
304
+
305
+ retry_config = None
306
+ if isinstance(retries, utils.RetryConfig):
307
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
308
+
309
+ http_res = await self.do_request_async(
310
+ hook_ctx=HookContext(
311
+ config=self.sdk_configuration,
312
+ base_url=base_url or "",
313
+ operation_id="public_stats",
314
+ oauth2_scopes=None,
315
+ security_source=get_security_from_env(
316
+ self.sdk_configuration.security, models.Security
317
+ ),
318
+ ),
319
+ request=req,
320
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
321
+ retry_config=retry_config,
322
+ )
323
+
324
+ if utils.match_response(http_res, "200", "application/json"):
325
+ return unmarshal_json_response(Any, http_res)
326
+ if utils.match_response(http_res, "4XX", "*"):
327
+ http_res_text = await utils.stream_to_text_async(http_res)
328
+ raise errors.PermitstackDefaultError(
329
+ "API error occurred", http_res, http_res_text
330
+ )
331
+ if utils.match_response(http_res, "5XX", "*"):
332
+ http_res_text = await utils.stream_to_text_async(http_res)
333
+ raise errors.PermitstackDefaultError(
334
+ "API error occurred", http_res, http_res_text
335
+ )
336
+
337
+ raise errors.PermitstackDefaultError("Unexpected response received", http_res)
@@ -12,10 +12,7 @@ if TYPE_CHECKING:
12
12
  )
13
13
  from .contractorsummary import ContractorSummary, ContractorSummaryTypedDict
14
14
  from .delete_webhookop import DeleteWebhookRequest, DeleteWebhookRequestTypedDict
15
- from .export_permits_csvop import (
16
- ExportPermitsCsvRequest,
17
- ExportPermitsCsvRequestTypedDict,
18
- )
15
+ from .export_permitsop import ExportPermitsRequest, ExportPermitsRequestTypedDict
19
16
  from .get_contractor_permitsop import (
20
17
  GetContractorPermitsRequest,
21
18
  GetContractorPermitsRequestTypedDict,
@@ -30,7 +27,10 @@ if TYPE_CHECKING:
30
27
  GetPropertyHistoryRequest,
31
28
  GetPropertyHistoryRequestTypedDict,
32
29
  )
33
- from .permitcategory import PermitCategory
30
+ from .get_webhook_secretop import (
31
+ GetWebhookSecretRequest,
32
+ GetWebhookSecretRequestTypedDict,
33
+ )
34
34
  from .permitdetail import PermitDetail, PermitDetailTypedDict
35
35
  from .permitsearchresponse import (
36
36
  PermitSearchResponse,
@@ -45,6 +45,7 @@ if TYPE_CHECKING:
45
45
  )
46
46
  from .search_permitsop import SearchPermitsRequest, SearchPermitsRequestTypedDict
47
47
  from .security import Security, SecurityTypedDict
48
+ from .test_webhookop import TestWebhookRequest, TestWebhookRequestTypedDict
48
49
  from .validationerror import (
49
50
  Context,
50
51
  ContextTypedDict,
@@ -66,8 +67,8 @@ __all__ = [
66
67
  "ContractorSummaryTypedDict",
67
68
  "DeleteWebhookRequest",
68
69
  "DeleteWebhookRequestTypedDict",
69
- "ExportPermitsCsvRequest",
70
- "ExportPermitsCsvRequestTypedDict",
70
+ "ExportPermitsRequest",
71
+ "ExportPermitsRequestTypedDict",
71
72
  "GetContractorPermitsRequest",
72
73
  "GetContractorPermitsRequestTypedDict",
73
74
  "GetContractorRequest",
@@ -78,9 +79,10 @@ __all__ = [
78
79
  "GetPermitsByAddressRequestTypedDict",
79
80
  "GetPropertyHistoryRequest",
80
81
  "GetPropertyHistoryRequestTypedDict",
82
+ "GetWebhookSecretRequest",
83
+ "GetWebhookSecretRequestTypedDict",
81
84
  "Loc",
82
85
  "LocTypedDict",
83
- "PermitCategory",
84
86
  "PermitDetail",
85
87
  "PermitDetailTypedDict",
86
88
  "PermitSearchResponse",
@@ -95,6 +97,8 @@ __all__ = [
95
97
  "SearchPermitsRequestTypedDict",
96
98
  "Security",
97
99
  "SecurityTypedDict",
100
+ "TestWebhookRequest",
101
+ "TestWebhookRequestTypedDict",
98
102
  "ValidationError",
99
103
  "ValidationErrorTypedDict",
100
104
  "WebhookCreate",
@@ -110,8 +114,8 @@ _dynamic_imports: dict[str, str] = {
110
114
  "ContractorSummaryTypedDict": ".contractorsummary",
111
115
  "DeleteWebhookRequest": ".delete_webhookop",
112
116
  "DeleteWebhookRequestTypedDict": ".delete_webhookop",
113
- "ExportPermitsCsvRequest": ".export_permits_csvop",
114
- "ExportPermitsCsvRequestTypedDict": ".export_permits_csvop",
117
+ "ExportPermitsRequest": ".export_permitsop",
118
+ "ExportPermitsRequestTypedDict": ".export_permitsop",
115
119
  "GetContractorPermitsRequest": ".get_contractor_permitsop",
116
120
  "GetContractorPermitsRequestTypedDict": ".get_contractor_permitsop",
117
121
  "GetContractorRequest": ".get_contractorop",
@@ -122,7 +126,8 @@ _dynamic_imports: dict[str, str] = {
122
126
  "GetPermitsByAddressRequestTypedDict": ".get_permits_by_addressop",
123
127
  "GetPropertyHistoryRequest": ".get_property_historyop",
124
128
  "GetPropertyHistoryRequestTypedDict": ".get_property_historyop",
125
- "PermitCategory": ".permitcategory",
129
+ "GetWebhookSecretRequest": ".get_webhook_secretop",
130
+ "GetWebhookSecretRequestTypedDict": ".get_webhook_secretop",
126
131
  "PermitDetail": ".permitdetail",
127
132
  "PermitDetailTypedDict": ".permitdetail",
128
133
  "PermitSearchResponse": ".permitsearchresponse",
@@ -137,6 +142,8 @@ _dynamic_imports: dict[str, str] = {
137
142
  "SearchPermitsRequestTypedDict": ".search_permitsop",
138
143
  "Security": ".security",
139
144
  "SecurityTypedDict": ".security",
145
+ "TestWebhookRequest": ".test_webhookop",
146
+ "TestWebhookRequestTypedDict": ".test_webhookop",
140
147
  "Context": ".validationerror",
141
148
  "ContextTypedDict": ".validationerror",
142
149
  "Loc": ".validationerror",
@@ -0,0 +1,180 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ from .permitstatus import PermitStatus
5
+ from .propertytype import PropertyType
6
+ from datetime import date
7
+ from permitstack.types import (
8
+ BaseModel,
9
+ Nullable,
10
+ OptionalNullable,
11
+ UNSET,
12
+ UNSET_SENTINEL,
13
+ )
14
+ from permitstack.utils import FieldMetadata, QueryParamMetadata
15
+ from pydantic import model_serializer
16
+ from typing import Optional
17
+ from typing_extensions import Annotated, NotRequired, TypedDict
18
+
19
+
20
+ class ExportPermitsRequestTypedDict(TypedDict):
21
+ zip_code: NotRequired[Nullable[str]]
22
+ city: NotRequired[Nullable[str]]
23
+ state: NotRequired[Nullable[str]]
24
+ category: NotRequired[Nullable[str]]
25
+ status: NotRequired[Nullable[PermitStatus]]
26
+ property_type: NotRequired[Nullable[PropertyType]]
27
+ tag: NotRequired[Nullable[str]]
28
+ filed_after: NotRequired[Nullable[date]]
29
+ filed_before: NotRequired[Nullable[date]]
30
+ issued_after: NotRequired[Nullable[date]]
31
+ issued_before: NotRequired[Nullable[date]]
32
+ min_value: NotRequired[Nullable[float]]
33
+ max_value: NotRequired[Nullable[float]]
34
+ q: NotRequired[Nullable[str]]
35
+ contractor_name: NotRequired[Nullable[str]]
36
+ limit: NotRequired[int]
37
+
38
+
39
+ class ExportPermitsRequest(BaseModel):
40
+ zip_code: Annotated[
41
+ OptionalNullable[str],
42
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
43
+ ] = UNSET
44
+
45
+ city: Annotated[
46
+ OptionalNullable[str],
47
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
48
+ ] = UNSET
49
+
50
+ state: Annotated[
51
+ OptionalNullable[str],
52
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
53
+ ] = UNSET
54
+
55
+ category: Annotated[
56
+ OptionalNullable[str],
57
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
58
+ ] = UNSET
59
+
60
+ status: Annotated[
61
+ OptionalNullable[PermitStatus],
62
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
63
+ ] = UNSET
64
+
65
+ property_type: Annotated[
66
+ OptionalNullable[PropertyType],
67
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
68
+ ] = UNSET
69
+
70
+ tag: Annotated[
71
+ OptionalNullable[str],
72
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
73
+ ] = UNSET
74
+
75
+ filed_after: Annotated[
76
+ OptionalNullable[date],
77
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
78
+ ] = UNSET
79
+
80
+ filed_before: Annotated[
81
+ OptionalNullable[date],
82
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
83
+ ] = UNSET
84
+
85
+ issued_after: Annotated[
86
+ OptionalNullable[date],
87
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
88
+ ] = UNSET
89
+
90
+ issued_before: Annotated[
91
+ OptionalNullable[date],
92
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
93
+ ] = UNSET
94
+
95
+ min_value: Annotated[
96
+ OptionalNullable[float],
97
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
98
+ ] = UNSET
99
+
100
+ max_value: Annotated[
101
+ OptionalNullable[float],
102
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
103
+ ] = UNSET
104
+
105
+ q: Annotated[
106
+ OptionalNullable[str],
107
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
108
+ ] = UNSET
109
+
110
+ contractor_name: Annotated[
111
+ OptionalNullable[str],
112
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
113
+ ] = UNSET
114
+
115
+ limit: Annotated[
116
+ Optional[int],
117
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
118
+ ] = 1000
119
+
120
+ @model_serializer(mode="wrap")
121
+ def serialize_model(self, handler):
122
+ optional_fields = set(
123
+ [
124
+ "zip_code",
125
+ "city",
126
+ "state",
127
+ "category",
128
+ "status",
129
+ "property_type",
130
+ "tag",
131
+ "filed_after",
132
+ "filed_before",
133
+ "issued_after",
134
+ "issued_before",
135
+ "min_value",
136
+ "max_value",
137
+ "q",
138
+ "contractor_name",
139
+ "limit",
140
+ ]
141
+ )
142
+ nullable_fields = set(
143
+ [
144
+ "zip_code",
145
+ "city",
146
+ "state",
147
+ "category",
148
+ "status",
149
+ "property_type",
150
+ "tag",
151
+ "filed_after",
152
+ "filed_before",
153
+ "issued_after",
154
+ "issued_before",
155
+ "min_value",
156
+ "max_value",
157
+ "q",
158
+ "contractor_name",
159
+ ]
160
+ )
161
+ serialized = handler(self)
162
+ m = {}
163
+
164
+ for n, f in type(self).model_fields.items():
165
+ k = f.alias or n
166
+ val = serialized.get(k, serialized.get(n))
167
+ is_nullable_and_explicitly_set = (
168
+ k in nullable_fields
169
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
170
+ )
171
+
172
+ if val != UNSET_SENTINEL:
173
+ if (
174
+ val is not None
175
+ or k not in optional_fields
176
+ or is_nullable_and_explicitly_set
177
+ ):
178
+ m[k] = val
179
+
180
+ return m
@@ -0,0 +1,16 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ from permitstack.types import BaseModel
5
+ from permitstack.utils import FieldMetadata, PathParamMetadata
6
+ from typing_extensions import Annotated, TypedDict
7
+
8
+
9
+ class GetWebhookSecretRequestTypedDict(TypedDict):
10
+ webhook_id: str
11
+
12
+
13
+ class GetWebhookSecretRequest(BaseModel):
14
+ webhook_id: Annotated[
15
+ str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
16
+ ]