pyloops 1.6.0__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 (68) hide show
  1. pyloops-1.6.0/PKG-INFO +131 -0
  2. pyloops-1.6.0/README.md +107 -0
  3. pyloops-1.6.0/pyproject.toml +42 -0
  4. pyloops-1.6.0/src/pyloops/__init__.py +8 -0
  5. pyloops-1.6.0/src/pyloops/api/__init__.py +1 -0
  6. pyloops-1.6.0/src/pyloops/api/api_key/__init__.py +1 -0
  7. pyloops-1.6.0/src/pyloops/api/api_key/get_api_key.py +133 -0
  8. pyloops-1.6.0/src/pyloops/api/contact_properties/__init__.py +1 -0
  9. pyloops-1.6.0/src/pyloops/api/contact_properties/get_contacts_properties.py +180 -0
  10. pyloops-1.6.0/src/pyloops/api/contact_properties/post_contacts_properties.py +178 -0
  11. pyloops-1.6.0/src/pyloops/api/contacts/__init__.py +1 -0
  12. pyloops-1.6.0/src/pyloops/api/contacts/get_contacts_find.py +197 -0
  13. pyloops-1.6.0/src/pyloops/api/contacts/post_contacts_create.py +183 -0
  14. pyloops-1.6.0/src/pyloops/api/contacts/post_contacts_delete.py +183 -0
  15. pyloops-1.6.0/src/pyloops/api/contacts/put_contacts_update.py +186 -0
  16. pyloops-1.6.0/src/pyloops/api/dedicated_sending_i_ps/__init__.py +1 -0
  17. pyloops-1.6.0/src/pyloops/api/dedicated_sending_i_ps/get_dedicated_sending_ips.py +144 -0
  18. pyloops-1.6.0/src/pyloops/api/events/__init__.py +1 -0
  19. pyloops-1.6.0/src/pyloops/api/events/post_events_send.py +199 -0
  20. pyloops-1.6.0/src/pyloops/api/mailing_lists/__init__.py +1 -0
  21. pyloops-1.6.0/src/pyloops/api/mailing_lists/get_lists.py +144 -0
  22. pyloops-1.6.0/src/pyloops/api/transactional_emails/__init__.py +1 -0
  23. pyloops-1.6.0/src/pyloops/api/transactional_emails/get_transactional.py +115 -0
  24. pyloops-1.6.0/src/pyloops/api/transactional_emails/post_transactional.py +323 -0
  25. pyloops-1.6.0/src/pyloops/client.py +268 -0
  26. pyloops-1.6.0/src/pyloops/errors.py +16 -0
  27. pyloops-1.6.0/src/pyloops/models/__init__.py +83 -0
  28. pyloops-1.6.0/src/pyloops/models/contact.py +240 -0
  29. pyloops-1.6.0/src/pyloops/models/contact_delete_request.py +69 -0
  30. pyloops-1.6.0/src/pyloops/models/contact_delete_response.py +69 -0
  31. pyloops-1.6.0/src/pyloops/models/contact_failure_response.py +69 -0
  32. pyloops-1.6.0/src/pyloops/models/contact_mailing_lists.py +46 -0
  33. pyloops-1.6.0/src/pyloops/models/contact_opt_in_status_type_1.py +10 -0
  34. pyloops-1.6.0/src/pyloops/models/contact_opt_in_status_type_2_type_1.py +10 -0
  35. pyloops-1.6.0/src/pyloops/models/contact_opt_in_status_type_3_type_1.py +10 -0
  36. pyloops-1.6.0/src/pyloops/models/contact_property.py +77 -0
  37. pyloops-1.6.0/src/pyloops/models/contact_property_create_request.py +69 -0
  38. pyloops-1.6.0/src/pyloops/models/contact_property_failure_response.py +69 -0
  39. pyloops-1.6.0/src/pyloops/models/contact_property_success_response.py +61 -0
  40. pyloops-1.6.0/src/pyloops/models/contact_request.py +143 -0
  41. pyloops-1.6.0/src/pyloops/models/contact_request_mailing_lists.py +46 -0
  42. pyloops-1.6.0/src/pyloops/models/contact_success_response.py +69 -0
  43. pyloops-1.6.0/src/pyloops/models/contact_update_request.py +141 -0
  44. pyloops-1.6.0/src/pyloops/models/contact_update_request_mailing_lists.py +46 -0
  45. pyloops-1.6.0/src/pyloops/models/event_failure_response.py +69 -0
  46. pyloops-1.6.0/src/pyloops/models/event_request.py +135 -0
  47. pyloops-1.6.0/src/pyloops/models/event_request_event_properties.py +46 -0
  48. pyloops-1.6.0/src/pyloops/models/event_request_mailing_lists.py +46 -0
  49. pyloops-1.6.0/src/pyloops/models/event_success_response.py +61 -0
  50. pyloops-1.6.0/src/pyloops/models/get_api_key_response_200.py +69 -0
  51. pyloops-1.6.0/src/pyloops/models/get_api_key_response_401.py +79 -0
  52. pyloops-1.6.0/src/pyloops/models/get_dedicated_sending_ips_response_500.py +69 -0
  53. pyloops-1.6.0/src/pyloops/models/idempotency_key_failure_response.py +69 -0
  54. pyloops-1.6.0/src/pyloops/models/mailing_list.py +85 -0
  55. pyloops-1.6.0/src/pyloops/models/transactional_failure_2_response.py +77 -0
  56. pyloops-1.6.0/src/pyloops/models/transactional_failure_3_response.py +83 -0
  57. pyloops-1.6.0/src/pyloops/models/transactional_failure_3_response_error.py +70 -0
  58. pyloops-1.6.0/src/pyloops/models/transactional_failure_4_response.py +83 -0
  59. pyloops-1.6.0/src/pyloops/models/transactional_failure_4_response_error.py +70 -0
  60. pyloops-1.6.0/src/pyloops/models/transactional_failure_5_response.py +91 -0
  61. pyloops-1.6.0/src/pyloops/models/transactional_failure_5_response_error.py +70 -0
  62. pyloops-1.6.0/src/pyloops/models/transactional_failure_response.py +69 -0
  63. pyloops-1.6.0/src/pyloops/models/transactional_request.py +128 -0
  64. pyloops-1.6.0/src/pyloops/models/transactional_request_attachments_item.py +77 -0
  65. pyloops-1.6.0/src/pyloops/models/transactional_request_data_variables.py +46 -0
  66. pyloops-1.6.0/src/pyloops/models/transactional_success_response.py +61 -0
  67. pyloops-1.6.0/src/pyloops/py.typed +1 -0
  68. pyloops-1.6.0/src/pyloops/types.py +54 -0
pyloops-1.6.0/PKG-INFO ADDED
@@ -0,0 +1,131 @@
1
+ Metadata-Version: 2.3
2
+ Name: pyloops
3
+ Version: 1.6.0
4
+ Summary: Unofficial Python SDK for Loops.so email platform
5
+ Keywords: loops,email,api,sdk,loops.so
6
+ Author: zegerius
7
+ Author-email: zegerius <aram@askaletta.com>
8
+ License: MIT
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Requires-Dist: httpx>=0.23.0,<0.29.0
17
+ Requires-Dist: attrs>=22.2.0
18
+ Requires-Dist: python-dateutil>=2.8.0,<3
19
+ Requires-Python: >=3.12
20
+ Project-URL: Documentation, https://loops.so/docs
21
+ Project-URL: Homepage, https://github.com/doctorgpt-corp/pyloops
22
+ Project-URL: Repository, https://github.com/doctorgpt-corp/pyloops
23
+ Description-Content-Type: text/markdown
24
+
25
+ # PyLoops
26
+
27
+ Unofficial Python SDK for [Loops.so](https://loops.so).
28
+
29
+ [![PyPI version](https://badge.fury.io/py/pyloops.svg)](https://badge.fury.io/py/pyloops)
30
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ pip install pyloops
36
+ ```
37
+
38
+ Or with uv:
39
+
40
+ ```bash
41
+ uv add pyloops
42
+ ```
43
+
44
+ ## Quick Start
45
+
46
+ ```python
47
+ from pyloops import Client
48
+
49
+ # Initialize the client with your API key
50
+ client = Client(base_url="https://app.loops.so/api/v1", token="your_api_key_here")
51
+
52
+ # Create a contact
53
+ from pyloops.api.contacts import create_contact
54
+ from pyloops.models import CreateContactBody
55
+
56
+ response = create_contact.sync(
57
+ client=client,
58
+ body=CreateContactBody(
59
+ email="user@example.com",
60
+ first_name="John",
61
+ last_name="Doe"
62
+ )
63
+ )
64
+
65
+ print(response)
66
+ ```
67
+
68
+ ## Authentication
69
+
70
+ All API calls require a Loops API key. Get your API key from your [Loops account settings](https://app.loops.so/settings).
71
+
72
+ ```python
73
+ from pyloops import Client
74
+
75
+ client = Client(
76
+ base_url="https://app.loops.so/api/v1",
77
+ token="your_api_key_here"
78
+ )
79
+ ```
80
+
81
+ ## Features
82
+
83
+ This SDK provides access to all Loops.so API endpoints:
84
+
85
+ - **Contacts**: Create, update, find, and delete contacts
86
+ - **Contact Properties**: Manage custom contact properties
87
+ - **Mailing Lists**: View available mailing lists
88
+ - **Events**: Trigger event-based emails
89
+ - **Transactional Emails**: Send and list transactional emails
90
+ - **Sending IPs**: Retrieve dedicated sending IP addresses
91
+
92
+ ## Documentation
93
+
94
+ For detailed API documentation, visit the [Loops.so API docs](https://loops.so/docs).
95
+
96
+ ## Automated Updates
97
+
98
+ This SDK is automatically updated to match the latest Loops.so API specification. The package version corresponds to the Loops API version (current: **1.6.0**).
99
+
100
+ A GitHub Action checks for API updates daily and creates a pull request when changes are detected. After review and merge, a new version is automatically published to PyPI.
101
+
102
+ ## Development
103
+
104
+ ### Setup
105
+
106
+ ```bash
107
+ # Clone the repository
108
+ git clone https://github.com/doctorgpt-corp/pyloops.git
109
+ cd pyloops
110
+
111
+ # Install dependencies with uv
112
+ uv sync
113
+ ```
114
+
115
+ ### Regenerate SDK
116
+
117
+ To manually regenerate the SDK from the latest OpenAPI spec:
118
+
119
+ ```bash
120
+ uv run openapi-python-client generate --url https://app.loops.so/openapi.yaml --meta uv
121
+ cp -r loops-open-api-spec-client/loops_open_api_spec_client/* src/pyloops/
122
+ rm -rf loops-open-api-spec-client
123
+ ```
124
+
125
+ ## License
126
+
127
+ MIT
128
+
129
+ ## Disclaimer
130
+
131
+ This is an unofficial SDK and is not affiliated with or endorsed by Loops.so.
@@ -0,0 +1,107 @@
1
+ # PyLoops
2
+
3
+ Unofficial Python SDK for [Loops.so](https://loops.so).
4
+
5
+ [![PyPI version](https://badge.fury.io/py/pyloops.svg)](https://badge.fury.io/py/pyloops)
6
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ pip install pyloops
12
+ ```
13
+
14
+ Or with uv:
15
+
16
+ ```bash
17
+ uv add pyloops
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ```python
23
+ from pyloops import Client
24
+
25
+ # Initialize the client with your API key
26
+ client = Client(base_url="https://app.loops.so/api/v1", token="your_api_key_here")
27
+
28
+ # Create a contact
29
+ from pyloops.api.contacts import create_contact
30
+ from pyloops.models import CreateContactBody
31
+
32
+ response = create_contact.sync(
33
+ client=client,
34
+ body=CreateContactBody(
35
+ email="user@example.com",
36
+ first_name="John",
37
+ last_name="Doe"
38
+ )
39
+ )
40
+
41
+ print(response)
42
+ ```
43
+
44
+ ## Authentication
45
+
46
+ All API calls require a Loops API key. Get your API key from your [Loops account settings](https://app.loops.so/settings).
47
+
48
+ ```python
49
+ from pyloops import Client
50
+
51
+ client = Client(
52
+ base_url="https://app.loops.so/api/v1",
53
+ token="your_api_key_here"
54
+ )
55
+ ```
56
+
57
+ ## Features
58
+
59
+ This SDK provides access to all Loops.so API endpoints:
60
+
61
+ - **Contacts**: Create, update, find, and delete contacts
62
+ - **Contact Properties**: Manage custom contact properties
63
+ - **Mailing Lists**: View available mailing lists
64
+ - **Events**: Trigger event-based emails
65
+ - **Transactional Emails**: Send and list transactional emails
66
+ - **Sending IPs**: Retrieve dedicated sending IP addresses
67
+
68
+ ## Documentation
69
+
70
+ For detailed API documentation, visit the [Loops.so API docs](https://loops.so/docs).
71
+
72
+ ## Automated Updates
73
+
74
+ This SDK is automatically updated to match the latest Loops.so API specification. The package version corresponds to the Loops API version (current: **1.6.0**).
75
+
76
+ A GitHub Action checks for API updates daily and creates a pull request when changes are detected. After review and merge, a new version is automatically published to PyPI.
77
+
78
+ ## Development
79
+
80
+ ### Setup
81
+
82
+ ```bash
83
+ # Clone the repository
84
+ git clone https://github.com/doctorgpt-corp/pyloops.git
85
+ cd pyloops
86
+
87
+ # Install dependencies with uv
88
+ uv sync
89
+ ```
90
+
91
+ ### Regenerate SDK
92
+
93
+ To manually regenerate the SDK from the latest OpenAPI spec:
94
+
95
+ ```bash
96
+ uv run openapi-python-client generate --url https://app.loops.so/openapi.yaml --meta uv
97
+ cp -r loops-open-api-spec-client/loops_open_api_spec_client/* src/pyloops/
98
+ rm -rf loops-open-api-spec-client
99
+ ```
100
+
101
+ ## License
102
+
103
+ MIT
104
+
105
+ ## Disclaimer
106
+
107
+ This is an unofficial SDK and is not affiliated with or endorsed by Loops.so.
@@ -0,0 +1,42 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.9.9,<0.10.0"]
3
+ build-backend = "uv_build"
4
+
5
+ [project]
6
+ name = "pyloops"
7
+ version = "1.6.0"
8
+ description = "Unofficial Python SDK for Loops.so email platform"
9
+ readme = "README.md"
10
+ requires-python = ">=3.12"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "zegerius", email = "aram@askaletta.com"}
14
+ ]
15
+ keywords = ["loops", "email", "api", "sdk", "loops.so"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Programming Language :: Python :: 3.14",
24
+ ]
25
+ dependencies = [
26
+ "httpx>=0.23.0,<0.29.0",
27
+ "attrs>=22.2.0",
28
+ "python-dateutil>=2.8.0,<3",
29
+ ]
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/doctorgpt-corp/pyloops"
33
+ Repository = "https://github.com/doctorgpt-corp/pyloops"
34
+ Documentation = "https://loops.so/docs"
35
+
36
+ [tool.uv.build-backend]
37
+ module-root = "src/"
38
+
39
+ [dependency-groups]
40
+ dev = [
41
+ "openapi-python-client>=0.27.1",
42
+ ]
@@ -0,0 +1,8 @@
1
+ """A client library for accessing Loops OpenAPI Spec"""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
@@ -0,0 +1 @@
1
+ """Contains methods for accessing the API"""
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -0,0 +1,133 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.get_api_key_response_200 import GetApiKeyResponse200
9
+ from ...models.get_api_key_response_401 import GetApiKeyResponse401
10
+ from ...types import Response
11
+
12
+
13
+ def _get_kwargs() -> dict[str, Any]:
14
+ _kwargs: dict[str, Any] = {
15
+ "method": "get",
16
+ "url": "/api-key",
17
+ }
18
+
19
+ return _kwargs
20
+
21
+
22
+ def _parse_response(
23
+ *, client: AuthenticatedClient | Client, response: httpx.Response
24
+ ) -> GetApiKeyResponse200 | GetApiKeyResponse401 | None:
25
+ if response.status_code == 200:
26
+ response_200 = GetApiKeyResponse200.from_dict(response.json())
27
+
28
+ return response_200
29
+
30
+ if response.status_code == 401:
31
+ response_401 = GetApiKeyResponse401.from_dict(response.json())
32
+
33
+ return response_401
34
+
35
+ if client.raise_on_unexpected_status:
36
+ raise errors.UnexpectedStatus(response.status_code, response.content)
37
+ else:
38
+ return None
39
+
40
+
41
+ def _build_response(
42
+ *, client: AuthenticatedClient | Client, response: httpx.Response
43
+ ) -> Response[GetApiKeyResponse200 | GetApiKeyResponse401]:
44
+ return Response(
45
+ status_code=HTTPStatus(response.status_code),
46
+ content=response.content,
47
+ headers=response.headers,
48
+ parsed=_parse_response(client=client, response=response),
49
+ )
50
+
51
+
52
+ def sync_detailed(
53
+ *,
54
+ client: AuthenticatedClient,
55
+ ) -> Response[GetApiKeyResponse200 | GetApiKeyResponse401]:
56
+ """Test your API key
57
+
58
+ Raises:
59
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
60
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
61
+
62
+ Returns:
63
+ Response[GetApiKeyResponse200 | GetApiKeyResponse401]
64
+ """
65
+
66
+ kwargs = _get_kwargs()
67
+
68
+ response = client.get_httpx_client().request(
69
+ **kwargs,
70
+ )
71
+
72
+ return _build_response(client=client, response=response)
73
+
74
+
75
+ def sync(
76
+ *,
77
+ client: AuthenticatedClient,
78
+ ) -> GetApiKeyResponse200 | GetApiKeyResponse401 | None:
79
+ """Test your API key
80
+
81
+ Raises:
82
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
83
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
84
+
85
+ Returns:
86
+ GetApiKeyResponse200 | GetApiKeyResponse401
87
+ """
88
+
89
+ return sync_detailed(
90
+ client=client,
91
+ ).parsed
92
+
93
+
94
+ async def asyncio_detailed(
95
+ *,
96
+ client: AuthenticatedClient,
97
+ ) -> Response[GetApiKeyResponse200 | GetApiKeyResponse401]:
98
+ """Test your API key
99
+
100
+ Raises:
101
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
102
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
103
+
104
+ Returns:
105
+ Response[GetApiKeyResponse200 | GetApiKeyResponse401]
106
+ """
107
+
108
+ kwargs = _get_kwargs()
109
+
110
+ response = await client.get_async_httpx_client().request(**kwargs)
111
+
112
+ return _build_response(client=client, response=response)
113
+
114
+
115
+ async def asyncio(
116
+ *,
117
+ client: AuthenticatedClient,
118
+ ) -> GetApiKeyResponse200 | GetApiKeyResponse401 | None:
119
+ """Test your API key
120
+
121
+ Raises:
122
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
123
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
124
+
125
+ Returns:
126
+ GetApiKeyResponse200 | GetApiKeyResponse401
127
+ """
128
+
129
+ return (
130
+ await asyncio_detailed(
131
+ client=client,
132
+ )
133
+ ).parsed
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -0,0 +1,180 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, cast
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.contact_property import ContactProperty
9
+ from ...types import UNSET, Response, Unset
10
+
11
+
12
+ def _get_kwargs(
13
+ *,
14
+ list_: str | Unset = UNSET,
15
+ ) -> dict[str, Any]:
16
+ params: dict[str, Any] = {}
17
+
18
+ params["list"] = list_
19
+
20
+ params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
21
+
22
+ _kwargs: dict[str, Any] = {
23
+ "method": "get",
24
+ "url": "/contacts/properties",
25
+ "params": params,
26
+ }
27
+
28
+ return _kwargs
29
+
30
+
31
+ def _parse_response(
32
+ *, client: AuthenticatedClient | Client, response: httpx.Response
33
+ ) -> Any | list[ContactProperty] | None:
34
+ if response.status_code == 200:
35
+ response_200 = []
36
+ _response_200 = response.json()
37
+ for response_200_item_data in _response_200:
38
+ response_200_item = ContactProperty.from_dict(response_200_item_data)
39
+
40
+ response_200.append(response_200_item)
41
+
42
+ return response_200
43
+
44
+ if response.status_code == 405:
45
+ response_405 = cast(Any, None)
46
+ return response_405
47
+
48
+ if client.raise_on_unexpected_status:
49
+ raise errors.UnexpectedStatus(response.status_code, response.content)
50
+ else:
51
+ return None
52
+
53
+
54
+ def _build_response(
55
+ *, client: AuthenticatedClient | Client, response: httpx.Response
56
+ ) -> Response[Any | list[ContactProperty]]:
57
+ return Response(
58
+ status_code=HTTPStatus(response.status_code),
59
+ content=response.content,
60
+ headers=response.headers,
61
+ parsed=_parse_response(client=client, response=response),
62
+ )
63
+
64
+
65
+ def sync_detailed(
66
+ *,
67
+ client: AuthenticatedClient,
68
+ list_: str | Unset = UNSET,
69
+ ) -> Response[Any | list[ContactProperty]]:
70
+ r"""Get a list of contact properties
71
+
72
+ Retrieve a list of your account's contact properties.<br>Use the `list` parameter to query \"all\"
73
+ or \"custom\" properties.
74
+
75
+ Args:
76
+ list_ (str | Unset):
77
+
78
+ Raises:
79
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
80
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
81
+
82
+ Returns:
83
+ Response[Any | list[ContactProperty]]
84
+ """
85
+
86
+ kwargs = _get_kwargs(
87
+ list_=list_,
88
+ )
89
+
90
+ response = client.get_httpx_client().request(
91
+ **kwargs,
92
+ )
93
+
94
+ return _build_response(client=client, response=response)
95
+
96
+
97
+ def sync(
98
+ *,
99
+ client: AuthenticatedClient,
100
+ list_: str | Unset = UNSET,
101
+ ) -> Any | list[ContactProperty] | None:
102
+ r"""Get a list of contact properties
103
+
104
+ Retrieve a list of your account's contact properties.<br>Use the `list` parameter to query \"all\"
105
+ or \"custom\" properties.
106
+
107
+ Args:
108
+ list_ (str | Unset):
109
+
110
+ Raises:
111
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
112
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
113
+
114
+ Returns:
115
+ Any | list[ContactProperty]
116
+ """
117
+
118
+ return sync_detailed(
119
+ client=client,
120
+ list_=list_,
121
+ ).parsed
122
+
123
+
124
+ async def asyncio_detailed(
125
+ *,
126
+ client: AuthenticatedClient,
127
+ list_: str | Unset = UNSET,
128
+ ) -> Response[Any | list[ContactProperty]]:
129
+ r"""Get a list of contact properties
130
+
131
+ Retrieve a list of your account's contact properties.<br>Use the `list` parameter to query \"all\"
132
+ or \"custom\" properties.
133
+
134
+ Args:
135
+ list_ (str | Unset):
136
+
137
+ Raises:
138
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
139
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
140
+
141
+ Returns:
142
+ Response[Any | list[ContactProperty]]
143
+ """
144
+
145
+ kwargs = _get_kwargs(
146
+ list_=list_,
147
+ )
148
+
149
+ response = await client.get_async_httpx_client().request(**kwargs)
150
+
151
+ return _build_response(client=client, response=response)
152
+
153
+
154
+ async def asyncio(
155
+ *,
156
+ client: AuthenticatedClient,
157
+ list_: str | Unset = UNSET,
158
+ ) -> Any | list[ContactProperty] | None:
159
+ r"""Get a list of contact properties
160
+
161
+ Retrieve a list of your account's contact properties.<br>Use the `list` parameter to query \"all\"
162
+ or \"custom\" properties.
163
+
164
+ Args:
165
+ list_ (str | Unset):
166
+
167
+ Raises:
168
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
169
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
170
+
171
+ Returns:
172
+ Any | list[ContactProperty]
173
+ """
174
+
175
+ return (
176
+ await asyncio_detailed(
177
+ client=client,
178
+ list_=list_,
179
+ )
180
+ ).parsed