airbyte-agent-zendesk-support 0.18.53__tar.gz → 0.18.55__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 (60) hide show
  1. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/CHANGELOG.md +10 -0
  2. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/PKG-INFO +34 -21
  3. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/README.md +33 -20
  4. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/REFERENCE.md +0 -91
  5. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +57 -4
  6. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +29 -8
  7. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +50 -1
  8. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +9 -1
  9. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +9 -0
  10. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/pyproject.toml +1 -1
  11. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/.gitignore +0 -0
  12. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/__init__.py +0 -0
  13. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/__init__.py +0 -0
  14. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py +0 -0
  15. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +0 -0
  16. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  17. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  18. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py +0 -0
  19. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py +0 -0
  20. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py +0 -0
  21. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  22. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py +0 -0
  23. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +0 -0
  24. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py +0 -0
  25. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  26. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  27. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py +0 -0
  28. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py +0 -0
  29. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py +0 -0
  30. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +0 -0
  31. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py +0 -0
  32. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py +0 -0
  33. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py +0 -0
  34. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +0 -0
  35. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +0 -0
  36. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py +0 -0
  37. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py +0 -0
  38. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +0 -0
  39. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py +0 -0
  40. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +0 -0
  41. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py +0 -0
  42. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  43. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +0 -0
  44. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py +0 -0
  45. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +0 -0
  46. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +0 -0
  47. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py +0 -0
  48. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +0 -0
  49. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +0 -0
  50. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +0 -0
  51. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  52. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py +0 -0
  53. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +0 -0
  54. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  55. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py +0 -0
  56. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py +0 -0
  57. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/connector.py +0 -0
  58. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/connector_model.py +0 -0
  59. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/models.py +0 -0
  60. {airbyte_agent_zendesk_support-0.18.53 → airbyte_agent_zendesk_support-0.18.55}/airbyte_agent_zendesk_support/types.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Zendesk Support changelog
2
2
 
3
+ ## [0.18.55] - 2026-01-22
4
+ - Updated connector definition (YAML version 0.1.7)
5
+ - Source commit: 1da193dd
6
+ - SDK version: 0.1.0
7
+
8
+ ## [0.18.54] - 2026-01-22
9
+ - Updated connector definition (YAML version 0.1.7)
10
+ - Source commit: c713ec48
11
+ - SDK version: 0.1.0
12
+
3
13
  ## [0.18.53] - 2026-01-21
4
14
  - Updated connector definition (YAML version 0.1.7)
5
15
  - Source commit: 6fbe49cd
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-zendesk-support
3
- Version: 0.18.53
3
+ Version: 0.18.55
4
4
  Summary: Airbyte Zendesk-Support Connector for AI platforms
5
5
  Project-URL: Homepage, https://github.com/airbytehq/airbyte-agent-connectors
6
6
  Project-URL: Documentation, https://docs.airbyte.com/ai-agents/
@@ -71,38 +71,49 @@ uv pip install airbyte-agent-zendesk-support
71
71
 
72
72
  ## Usage
73
73
 
74
- This connector supports multiple authentication methods:
74
+ Connectors can run in open source or hosted mode.
75
75
 
76
- ### OAuth 2.0
76
+ ### Open source
77
+
78
+ In open source mode, you provide API credentials directly to the connector.
77
79
 
78
80
  ```python
79
- from airbyte_agent_zendesk_support import ZendeskSupportConnector
80
- from airbyte_agent_zendesk_support.models import ZendeskSupportOauth20AuthConfig
81
+ from airbyte_agent_zendesk-support import ZendeskSupportConnector
82
+ from airbyte_agent_zendesk_support.models import ZendeskSupportApiTokenAuthConfig
81
83
 
82
84
  connector = ZendeskSupportConnector(
83
- auth_config=ZendeskSupportOauth20AuthConfig(
84
- access_token="...",
85
- refresh_token="..."
86
- )
85
+ auth_config=ZendeskSupportApiTokenAuthConfig(
86
+ email="<Your Zendesk account email address>",
87
+ api_token="<Your Zendesk API token from Admin Center>"
88
+ )
87
89
  )
88
- result = await connector.tickets.list()
90
+
91
+ @agent.tool_plain # assumes you're using Pydantic AI
92
+ @ZendeskSupportConnector.describe
93
+ async def zendesk-support_execute(entity: str, action: str, params: dict | None = None):
94
+ return await connector.execute(entity, action, params or {})
89
95
  ```
90
96
 
91
- ### API Token
97
+ ### Hosted
98
+
99
+ In hosted mode, API credentials are stored securely in Airbyte Cloud. You provide your Airbyte credentials instead.
100
+
101
+ This example assumes you've already authenticated your connector with Airbyte. See [Authentication](AUTH.md) to learn more about authenticating. If you need a step-by-step guide, see the [hosted execution tutorial](https://docs.airbyte.com/ai-agents/hosted-execution).
92
102
 
93
103
  ```python
94
- from airbyte_agent_zendesk_support import ZendeskSupportConnector
95
- from airbyte_agent_zendesk_support.models import ZendeskSupportApiTokenAuthConfig
104
+ from airbyte_agent_zendesk-support import ZendeskSupportConnector
96
105
 
97
106
  connector = ZendeskSupportConnector(
98
- auth_config=ZendeskSupportApiTokenAuthConfig(
99
- email="...",
100
- api_token="..."
101
- )
107
+ external_user_id="<your-scoped-token>",
108
+ airbyte_client_id="<your-client-id>",
109
+ airbyte_client_secret="<your-client-secret>"
102
110
  )
103
- result = await connector.tickets.list()
104
- ```
105
111
 
112
+ @agent.tool_plain # assumes you're using Pydantic AI
113
+ @ZendeskSupportConnector.describe
114
+ async def zendesk-support_execute(entity: str, action: str, params: dict | None = None):
115
+ return await connector.execute(entity, action, params or {})
116
+ ```
106
117
 
107
118
  ## Full documentation
108
119
 
@@ -134,12 +145,14 @@ This connector supports the following entities and actions.
134
145
  | Article Attachments | [List](./REFERENCE.md#article-attachments-list), [Get](./REFERENCE.md#article-attachments-get), [Download](./REFERENCE.md#article-attachments-download) |
135
146
 
136
147
 
148
+ For all authentication options, see the connector's [authentication documentation](AUTH.md).
149
+
137
150
  For detailed documentation on available actions and parameters, see this connector's [full reference documentation](./REFERENCE.md).
138
151
 
139
152
  For the service's official API docs, see the [Zendesk-Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/).
140
153
 
141
154
  ## Version information
142
155
 
143
- - **Package version:** 0.18.53
156
+ - **Package version:** 0.18.55
144
157
  - **Connector version:** 0.1.7
145
- - **Generated with Connector SDK commit SHA:** 6fbe49cd29847836209576c7ba21d94aacc1d834
158
+ - **Generated with Connector SDK commit SHA:** 1da193dd2b3d4b2e2147ba74bd9a4062a62c4186
@@ -38,38 +38,49 @@ uv pip install airbyte-agent-zendesk-support
38
38
 
39
39
  ## Usage
40
40
 
41
- This connector supports multiple authentication methods:
41
+ Connectors can run in open source or hosted mode.
42
42
 
43
- ### OAuth 2.0
43
+ ### Open source
44
+
45
+ In open source mode, you provide API credentials directly to the connector.
44
46
 
45
47
  ```python
46
- from airbyte_agent_zendesk_support import ZendeskSupportConnector
47
- from airbyte_agent_zendesk_support.models import ZendeskSupportOauth20AuthConfig
48
+ from airbyte_agent_zendesk-support import ZendeskSupportConnector
49
+ from airbyte_agent_zendesk_support.models import ZendeskSupportApiTokenAuthConfig
48
50
 
49
51
  connector = ZendeskSupportConnector(
50
- auth_config=ZendeskSupportOauth20AuthConfig(
51
- access_token="...",
52
- refresh_token="..."
53
- )
52
+ auth_config=ZendeskSupportApiTokenAuthConfig(
53
+ email="<Your Zendesk account email address>",
54
+ api_token="<Your Zendesk API token from Admin Center>"
55
+ )
54
56
  )
55
- result = await connector.tickets.list()
57
+
58
+ @agent.tool_plain # assumes you're using Pydantic AI
59
+ @ZendeskSupportConnector.describe
60
+ async def zendesk-support_execute(entity: str, action: str, params: dict | None = None):
61
+ return await connector.execute(entity, action, params or {})
56
62
  ```
57
63
 
58
- ### API Token
64
+ ### Hosted
65
+
66
+ In hosted mode, API credentials are stored securely in Airbyte Cloud. You provide your Airbyte credentials instead.
67
+
68
+ This example assumes you've already authenticated your connector with Airbyte. See [Authentication](AUTH.md) to learn more about authenticating. If you need a step-by-step guide, see the [hosted execution tutorial](https://docs.airbyte.com/ai-agents/hosted-execution).
59
69
 
60
70
  ```python
61
- from airbyte_agent_zendesk_support import ZendeskSupportConnector
62
- from airbyte_agent_zendesk_support.models import ZendeskSupportApiTokenAuthConfig
71
+ from airbyte_agent_zendesk-support import ZendeskSupportConnector
63
72
 
64
73
  connector = ZendeskSupportConnector(
65
- auth_config=ZendeskSupportApiTokenAuthConfig(
66
- email="...",
67
- api_token="..."
68
- )
74
+ external_user_id="<your-scoped-token>",
75
+ airbyte_client_id="<your-client-id>",
76
+ airbyte_client_secret="<your-client-secret>"
69
77
  )
70
- result = await connector.tickets.list()
71
- ```
72
78
 
79
+ @agent.tool_plain # assumes you're using Pydantic AI
80
+ @ZendeskSupportConnector.describe
81
+ async def zendesk-support_execute(entity: str, action: str, params: dict | None = None):
82
+ return await connector.execute(entity, action, params or {})
83
+ ```
73
84
 
74
85
  ## Full documentation
75
86
 
@@ -101,12 +112,14 @@ This connector supports the following entities and actions.
101
112
  | Article Attachments | [List](./REFERENCE.md#article-attachments-list), [Get](./REFERENCE.md#article-attachments-get), [Download](./REFERENCE.md#article-attachments-download) |
102
113
 
103
114
 
115
+ For all authentication options, see the connector's [authentication documentation](AUTH.md).
116
+
104
117
  For detailed documentation on available actions and parameters, see this connector's [full reference documentation](./REFERENCE.md).
105
118
 
106
119
  For the service's official API docs, see the [Zendesk-Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/).
107
120
 
108
121
  ## Version information
109
122
 
110
- - **Package version:** 0.18.53
123
+ - **Package version:** 0.18.55
111
124
  - **Connector version:** 0.1.7
112
- - **Generated with Connector SDK commit SHA:** 6fbe49cd29847836209576c7ba21d94aacc1d834
125
+ - **Generated with Connector SDK commit SHA:** 1da193dd2b3d4b2e2147ba74bd9a4062a62c4186
@@ -3748,94 +3748,3 @@ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_i
3748
3748
  | `range_header` | `string` | No | Optional Range header for partial downloads (e.g., 'bytes=0-99') |
3749
3749
 
3750
3750
 
3751
-
3752
-
3753
- ## Configuration
3754
-
3755
- The Zendesk-Support connector requires the following configuration variables. These variables are used to construct the base API URL. Pass them via the `config` parameter when initializing the connector.
3756
-
3757
- | Variable | Type | Required | Default | Description |
3758
- |----------|------|----------|---------|-------------|
3759
- | `subdomain` | `string` | Yes | your-subdomain | Your Zendesk subdomain |
3760
-
3761
-
3762
- ## Authentication
3763
-
3764
- The Zendesk-Support connector supports the following authentication methods.
3765
-
3766
-
3767
- ### OAuth 2.0
3768
-
3769
- | Field Name | Type | Required | Description |
3770
- |------------|------|----------|-------------|
3771
- | `access_token` | `str` | Yes | OAuth 2.0 access token |
3772
- | `refresh_token` | `str` | No | OAuth 2.0 refresh token (optional) |
3773
-
3774
- #### Example
3775
-
3776
- **Python SDK**
3777
-
3778
- ```python
3779
- ZendeskSupportConnector(
3780
- auth_config=ZendeskSupportOauth20AuthConfig(
3781
- access_token="<OAuth 2.0 access token>",
3782
- refresh_token="<OAuth 2.0 refresh token (optional)>"
3783
- )
3784
- )
3785
- ```
3786
-
3787
- **API**
3788
-
3789
- ```bash
3790
- curl --location 'https://api.airbyte.ai/api/v1/integrations/sources' \
3791
- --header 'Content-Type: application/json' \
3792
- --header 'Authorization: Bearer {your_auth_token}' \
3793
- --data '{
3794
- "workspace_id": "{your_workspace_id}",
3795
- "source_template_id": "{source_template_id}",
3796
- "auth_config": {
3797
- "access_token": "<OAuth 2.0 access token>",
3798
- "refresh_token": "<OAuth 2.0 refresh token (optional)>"
3799
- },
3800
- "name": "My Zendesk-Support Connector"
3801
- }'
3802
- ```
3803
-
3804
-
3805
- ### API Token
3806
-
3807
- | Field Name | Type | Required | Description |
3808
- |------------|------|----------|-------------|
3809
- | `email` | `str` | Yes | Your Zendesk account email address |
3810
- | `api_token` | `str` | Yes | Your Zendesk API token from Admin Center |
3811
-
3812
- #### Example
3813
-
3814
- **Python SDK**
3815
-
3816
- ```python
3817
- ZendeskSupportConnector(
3818
- auth_config=ZendeskSupportApiTokenAuthConfig(
3819
- email="<Your Zendesk account email address>",
3820
- api_token="<Your Zendesk API token from Admin Center>"
3821
- )
3822
- )
3823
- ```
3824
-
3825
- **API**
3826
-
3827
- ```bash
3828
- curl --location 'https://api.airbyte.ai/api/v1/integrations/sources' \
3829
- --header 'Content-Type: application/json' \
3830
- --header 'Authorization: Bearer {your_auth_token}' \
3831
- --data '{
3832
- "workspace_id": "{your_workspace_id}",
3833
- "source_template_id": "{source_template_id}",
3834
- "auth_config": {
3835
- "email": "<Your Zendesk account email address>",
3836
- "api_token": "<Your Zendesk API token from Admin Center>"
3837
- },
3838
- "name": "My Zendesk-Support Connector"
3839
- }'
3840
- ```
3841
-
@@ -152,6 +152,11 @@ class OAuth2AuthConfig(TypedDict, total=False):
152
152
  Note: Any config key can be used as a template variable in refresh_url.
153
153
  Common patterns: subdomain (Zendesk), shop (Shopify), region (AWS-style APIs).
154
154
 
155
+ additional_headers: Extra headers to inject alongside the OAuth2 Bearer token.
156
+ Useful for APIs that require both OAuth and an API key/client ID header.
157
+ Values support Jinja2 {{ variable }} template syntax to reference secrets.
158
+ Example: {"Amazon-Advertising-API-ClientId": "{{ client_id }}"}
159
+
155
160
  Examples:
156
161
  GitHub (simple):
157
162
  {"header": "Authorization", "prefix": "Bearer"}
@@ -169,6 +174,14 @@ class OAuth2AuthConfig(TypedDict, total=False):
169
174
  "auth_style": "basic",
170
175
  "body_format": "json"
171
176
  }
177
+
178
+ Amazon Ads (OAuth + additional client ID header):
179
+ {
180
+ "refresh_url": "https://api.amazon.com/auth/o2/token",
181
+ "additional_headers": {
182
+ "Amazon-Advertising-API-ClientId": "{{ client_id }}"
183
+ }
184
+ }
172
185
  """
173
186
 
174
187
  header: str
@@ -177,6 +190,7 @@ class OAuth2AuthConfig(TypedDict, total=False):
177
190
  auth_style: AuthStyle
178
191
  body_format: BodyFormat
179
192
  subdomain: str
193
+ additional_headers: dict[str, str]
180
194
 
181
195
 
182
196
  class OAuth2AuthSecrets(TypedDict):
@@ -552,9 +566,10 @@ class OAuth2AuthStrategy(AuthStrategy):
552
566
  config: OAuth2AuthConfig,
553
567
  secrets: OAuth2AuthSecrets,
554
568
  ) -> dict[str, str]:
555
- """Inject OAuth2 access token into headers.
569
+ """Inject OAuth2 access token and additional headers.
556
570
 
557
- Creates a copy of the headers dict with the OAuth2 token added.
571
+ Creates a copy of the headers dict with the OAuth2 token added,
572
+ plus any additional headers configured via additional_headers.
558
573
  The original headers dict is not modified.
559
574
 
560
575
  Args:
@@ -563,7 +578,7 @@ class OAuth2AuthStrategy(AuthStrategy):
563
578
  secrets: OAuth2 credentials including access_token
564
579
 
565
580
  Returns:
566
- New headers dict with OAuth2 token authentication injected
581
+ New headers dict with OAuth2 token and additional headers injected
567
582
 
568
583
  Raises:
569
584
  AuthenticationError: If access_token is missing
@@ -589,8 +604,46 @@ class OAuth2AuthStrategy(AuthStrategy):
589
604
  # Extract secret value (handle both SecretStr and plain str)
590
605
  token_value = extract_secret_value(access_token)
591
606
 
592
- # Inject into headers
607
+ # Inject OAuth2 Bearer token
593
608
  headers[header_name] = f"{prefix} {token_value}"
609
+
610
+ # Inject additional headers if configured
611
+ additional_headers = config.get("additional_headers")
612
+ if additional_headers:
613
+ headers = self._inject_additional_headers(headers, additional_headers, secrets)
614
+
615
+ return headers
616
+
617
+ def _inject_additional_headers(
618
+ self,
619
+ headers: dict[str, str],
620
+ additional_headers: dict[str, str],
621
+ secrets: dict[str, Any],
622
+ ) -> dict[str, str]:
623
+ """Inject additional headers with Jinja2 template variable substitution.
624
+
625
+ Processes additional_headers config, substituting {{ variable }} patterns
626
+ with values from secrets using Jinja2 templating.
627
+
628
+ Args:
629
+ headers: Headers dict to add to (modified in place)
630
+ additional_headers: Header name -> value template mapping
631
+ secrets: Secrets dict for variable substitution
632
+
633
+ Returns:
634
+ Headers dict with additional headers added
635
+ """
636
+ # Build template context with extracted secret values
637
+ template_context = {
638
+ key: extract_secret_value(value) for key, value in secrets.items()
639
+ }
640
+
641
+ for header_name, value_template in additional_headers.items():
642
+ # Use Jinja2 templating for variable substitution
643
+ template = Template(value_template)
644
+ header_value = template.render(**template_context)
645
+ headers[header_name] = header_value
646
+
594
647
  return headers
595
648
 
596
649
  def validate_credentials(self, secrets: OAuth2AuthSecrets) -> None: # type: ignore[override]
@@ -188,7 +188,7 @@ def parse_openapi_spec(raw_config: dict) -> OpenAPIConnector:
188
188
 
189
189
  def _extract_request_body_config(
190
190
  request_body: RequestBody | None, spec_dict: dict[str, Any]
191
- ) -> tuple[list[str], dict[str, Any] | None, dict[str, Any] | None]:
191
+ ) -> tuple[list[str], dict[str, Any] | None, dict[str, Any] | None, dict[str, Any]]:
192
192
  """Extract request body configuration (GraphQL or standard).
193
193
 
194
194
  Args:
@@ -196,17 +196,19 @@ def _extract_request_body_config(
196
196
  spec_dict: Full OpenAPI spec dict for $ref resolution
197
197
 
198
198
  Returns:
199
- Tuple of (body_fields, request_schema, graphql_body)
199
+ Tuple of (body_fields, request_schema, graphql_body, request_body_defaults)
200
200
  - body_fields: List of field names for standard JSON/form bodies
201
201
  - request_schema: Resolved request schema dict (for standard bodies)
202
202
  - graphql_body: GraphQL body configuration dict (for GraphQL bodies)
203
+ - request_body_defaults: Default values for request body fields
203
204
  """
204
205
  body_fields: list[str] = []
205
206
  request_schema: dict[str, Any] | None = None
206
207
  graphql_body: dict[str, Any] | None = None
208
+ request_body_defaults: dict[str, Any] = {}
207
209
 
208
210
  if not request_body:
209
- return body_fields, request_schema, graphql_body
211
+ return body_fields, request_schema, graphql_body, request_body_defaults
210
212
 
211
213
  # Check for GraphQL extension and extract GraphQL body configuration
212
214
  if request_body.x_airbyte_body_type:
@@ -216,7 +218,7 @@ def _extract_request_body_config(
216
218
  if isinstance(body_type_config, GraphQLBodyConfig):
217
219
  # Convert Pydantic model to dict, excluding None values
218
220
  graphql_body = body_type_config.model_dump(exclude_none=True, by_alias=False)
219
- return body_fields, request_schema, graphql_body
221
+ return body_fields, request_schema, graphql_body, request_body_defaults
220
222
 
221
223
  # Parse standard request body
222
224
  for content_type_key, media_type in request_body.content.items():
@@ -226,11 +228,15 @@ def _extract_request_body_config(
226
228
  # Resolve all $refs in the schema using jsonref
227
229
  request_schema = resolve_schema_refs(schema, spec_dict)
228
230
 
229
- # Extract body field names from resolved schema
231
+ # Extract body field names and defaults from resolved schema
230
232
  if isinstance(request_schema, dict) and "properties" in request_schema:
231
233
  body_fields = list(request_schema["properties"].keys())
234
+ # Extract default values for each property
235
+ for field_name, field_schema in request_schema["properties"].items():
236
+ if isinstance(field_schema, dict) and "default" in field_schema:
237
+ request_body_defaults[field_name] = field_schema["default"]
232
238
 
233
- return body_fields, request_schema, graphql_body
239
+ return body_fields, request_schema, graphql_body, request_body_defaults
234
240
 
235
241
 
236
242
  def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel:
@@ -315,6 +321,8 @@ def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel
315
321
  query_params: list[str] = []
316
322
  query_params_schema: dict[str, dict[str, Any]] = {}
317
323
  deep_object_params: list[str] = []
324
+ header_params: list[str] = []
325
+ header_params_schema: dict[str, dict[str, Any]] = {}
318
326
 
319
327
  if operation.parameters:
320
328
  for param in operation.parameters:
@@ -336,9 +344,12 @@ def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel
336
344
  # Check if this is a deepObject style parameter
337
345
  if hasattr(param, "style") and param.style == "deepObject":
338
346
  deep_object_params.append(param.name)
347
+ elif param.in_ == "header":
348
+ header_params.append(param.name)
349
+ header_params_schema[param.name] = schema_info
339
350
 
340
- # Extract body fields from request schema
341
- body_fields, request_schema, graphql_body = _extract_request_body_config(operation.request_body, spec_dict)
351
+ # Extract body fields and defaults from request schema
352
+ body_fields, request_schema, graphql_body, request_body_defaults = _extract_request_body_config(operation.request_body, spec_dict)
342
353
 
343
354
  # Extract response schema
344
355
  response_schema = None
@@ -372,6 +383,9 @@ def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel
372
383
  deep_object_params=deep_object_params,
373
384
  path_params=path_params,
374
385
  path_params_schema=path_params_schema,
386
+ header_params=header_params,
387
+ header_params_schema=header_params_schema,
388
+ request_body_defaults=request_body_defaults,
375
389
  content_type=content_type,
376
390
  request_schema=request_schema,
377
391
  response_schema=response_schema,
@@ -535,6 +549,13 @@ def _parse_oauth2_config(scheme: Any) -> dict[str, str]:
535
549
  if x_token_extract:
536
550
  config["token_extract"] = x_token_extract
537
551
 
552
+ # Extract additional_headers from x-airbyte-auth-config extension
553
+ x_auth_config = getattr(scheme, "x_airbyte_auth_config", None)
554
+ if x_auth_config:
555
+ additional_headers = getattr(x_auth_config, "additional_headers", None)
556
+ if additional_headers:
557
+ config["additional_headers"] = additional_headers
558
+
538
559
  return config
539
560
 
540
561
 
@@ -64,6 +64,7 @@ class _OperationContext:
64
64
  self.build_path = executor._build_path
65
65
  self.extract_query_params = executor._extract_query_params
66
66
  self.extract_body = executor._extract_body
67
+ self.extract_header_params = executor._extract_header_params
67
68
  self.build_request_body = executor._build_request_body
68
69
  self.determine_request_format = executor._determine_request_format
69
70
  self.validate_required_body_fields = executor._validate_required_body_fields
@@ -693,6 +694,42 @@ class LocalExecutor:
693
694
  """
694
695
  return {key: value for key, value in params.items() if key in allowed_fields and value is not None}
695
696
 
697
+ def _extract_header_params(
698
+ self, endpoint: EndpointDefinition, params: dict[str, Any], body: dict[str, Any] | None = None
699
+ ) -> dict[str, str]:
700
+ """Extract header parameters from params and schema defaults.
701
+
702
+ Also adds Content-Type header when there's a request body (unless already specified
703
+ as a header parameter in the OpenAPI spec).
704
+
705
+ Args:
706
+ endpoint: Endpoint definition with header_params and header_params_schema
707
+ params: All parameters
708
+ body: Request body (if any) - used to determine if Content-Type should be added
709
+
710
+ Returns:
711
+ Dictionary of header name -> value
712
+ """
713
+ headers: dict[str, str] = {}
714
+
715
+ for header_name in endpoint.header_params:
716
+ # Check if value is provided in params
717
+ if header_name in params and params[header_name] is not None:
718
+ headers[header_name] = str(params[header_name])
719
+ # Otherwise, use default from schema if available
720
+ elif header_name in endpoint.header_params_schema:
721
+ default_value = endpoint.header_params_schema[header_name].get("default")
722
+ if default_value is not None:
723
+ headers[header_name] = str(default_value)
724
+
725
+ # Add Content-Type header when there's a request body, but only if not already
726
+ # specified as a header parameter (which allows custom content types like
727
+ # application/vnd.spCampaign.v3+json)
728
+ if body is not None and endpoint.content_type and "Content-Type" not in headers:
729
+ headers["Content-Type"] = endpoint.content_type.value
730
+
731
+ return headers
732
+
696
733
  def _serialize_deep_object_params(self, params: dict[str, Any], deep_object_param_names: list[str]) -> dict[str, Any]:
697
734
  """Serialize deepObject parameters to bracket notation format.
698
735
 
@@ -848,7 +885,15 @@ class LocalExecutor:
848
885
  param_defaults = {name: schema.get("default") for name, schema in endpoint.query_params_schema.items() if "default" in schema}
849
886
  return self._build_graphql_body(endpoint.graphql_body, params, param_defaults)
850
887
  elif endpoint.body_fields:
851
- return self._extract_body(endpoint.body_fields, params)
888
+ # Start with defaults from request body schema
889
+ body = dict(endpoint.request_body_defaults)
890
+ # Override with user-provided params (filtering out None values)
891
+ user_body = self._extract_body(endpoint.body_fields, params)
892
+ body.update(user_body)
893
+ return body if body else None
894
+ elif endpoint.request_body_defaults:
895
+ # If no body_fields but we have defaults, return the defaults
896
+ return dict(endpoint.request_body_defaults)
852
897
  return None
853
898
 
854
899
  def _flatten_form_data(self, data: dict[str, Any], parent_key: str = "") -> dict[str, Any]:
@@ -1484,6 +1529,9 @@ class _StandardOperationHandler:
1484
1529
  # Determine request format (json/data parameters)
1485
1530
  request_kwargs = self.ctx.determine_request_format(endpoint, body)
1486
1531
 
1532
+ # Extract header parameters from OpenAPI operation (pass body to add Content-Type)
1533
+ header_params = self.ctx.extract_header_params(endpoint, params, body)
1534
+
1487
1535
  # Execute async HTTP request
1488
1536
  response_data, response_headers = await self.ctx.http_client.request(
1489
1537
  method=endpoint.method,
@@ -1491,6 +1539,7 @@ class _StandardOperationHandler:
1491
1539
  params=query_params if query_params else None,
1492
1540
  json=request_kwargs.get("json"),
1493
1541
  data=request_kwargs.get("data"),
1542
+ headers=header_params if header_params else None,
1494
1543
  )
1495
1544
 
1496
1545
  # Extract metadata from original response (before record extraction)
@@ -109,12 +109,20 @@ class AirbyteAuthConfig(BaseModel):
109
109
  description="Mapping from source config paths (e.g., 'credentials.api_key') to auth config keys for direct connectors",
110
110
  )
111
111
 
112
+ # Additional headers to inject alongside OAuth2 Bearer token
113
+ additional_headers: Dict[str, str] | None = Field(
114
+ None,
115
+ description=(
116
+ "Extra headers to inject with auth. Values support Jinja2 {{ variable }} template syntax "
117
+ "to reference secrets. Example: {'Amazon-Advertising-API-ClientId': '{{ client_id }}'}"
118
+ ),
119
+ )
120
+
112
121
  # Replication connector auth constants
113
122
  replication_auth_key_constants: Dict[str, Any] | None = Field(
114
123
  None,
115
124
  description="Constant values to always inject at source config paths (e.g., 'credentials.auth_type': 'OAuth2.0')",
116
125
  )
117
-
118
126
  # Multiple options (oneOf)
119
127
  one_of: List[AuthConfigOption] | None = Field(None, alias="oneOf")
120
128
 
@@ -180,6 +180,15 @@ class EndpointDefinition(BaseModel):
180
180
  default_factory=dict,
181
181
  description="Schema for path params including defaults: {name: {type, default, required}}",
182
182
  )
183
+ header_params: list[str] = Field(default_factory=list) # Header parameters from OpenAPI
184
+ header_params_schema: dict[str, dict[str, Any]] = Field(
185
+ default_factory=dict,
186
+ description="Schema for header params including defaults: {name: {type, default, required}}",
187
+ )
188
+ request_body_defaults: dict[str, Any] = Field(
189
+ default_factory=dict,
190
+ description="Default values for request body fields from OpenAPI schema",
191
+ )
183
192
  content_type: ContentType = ContentType.JSON
184
193
  request_schema: dict[str, Any] | None = None
185
194
  response_schema: dict[str, Any] | None = None
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "airbyte-agent-zendesk-support"
3
- version = "0.18.53"
3
+ version = "0.18.55"
4
4
  description = "Airbyte Zendesk-Support Connector for AI platforms"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"