airbyte-agent-amazon-ads 0.1.5__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/CHANGELOG.md +10 -0
  2. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/PKG-INFO +5 -4
  3. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/README.md +4 -3
  4. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/REFERENCE.md +71 -1
  5. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/__init__.py +20 -2
  6. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/executor/local_executor.py +3 -1
  7. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/base.py +34 -2
  8. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/components.py +5 -0
  9. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/extensions.py +71 -0
  10. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/connector.py +67 -1
  11. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/connector_model.py +1 -1
  12. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/models.py +55 -0
  13. airbyte_agent_amazon_ads-0.1.7/airbyte_agent_amazon_ads/types.py +238 -0
  14. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/pyproject.toml +1 -1
  15. airbyte_agent_amazon_ads-0.1.5/airbyte_agent_amazon_ads/types.py +0 -48
  16. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/.gitignore +0 -0
  17. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/AUTH.md +0 -0
  18. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/__init__.py +0 -0
  19. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/__init__.py +0 -0
  20. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/auth_strategies.py +0 -0
  21. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/auth_template.py +0 -0
  22. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  23. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  24. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/connector_model_loader.py +0 -0
  25. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/constants.py +0 -0
  26. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/exceptions.py +0 -0
  27. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/executor/__init__.py +0 -0
  28. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  29. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/executor/models.py +0 -0
  30. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/extensions.py +0 -0
  31. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/__init__.py +0 -0
  32. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  33. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  34. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/config.py +0 -0
  35. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/exceptions.py +0 -0
  36. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/protocols.py +0 -0
  37. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http/response.py +0 -0
  38. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/http_client.py +0 -0
  39. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/introspection.py +0 -0
  40. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/logging/__init__.py +0 -0
  41. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/logging/logger.py +0 -0
  42. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/logging/types.py +0 -0
  43. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/observability/__init__.py +0 -0
  44. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/observability/config.py +0 -0
  45. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/observability/models.py +0 -0
  46. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/observability/redactor.py +0 -0
  47. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/observability/session.py +0 -0
  48. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/performance/__init__.py +0 -0
  49. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  50. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/performance/metrics.py +0 -0
  51. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/__init__.py +0 -0
  52. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/connector.py +0 -0
  53. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/operations.py +0 -0
  54. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/schema/security.py +0 -0
  55. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/secrets.py +0 -0
  56. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  57. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/telemetry/config.py +0 -0
  58. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/telemetry/events.py +0 -0
  59. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  60. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/types.py +0 -0
  61. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/utils.py +0 -0
  62. {airbyte_agent_amazon_ads-0.1.5 → airbyte_agent_amazon_ads-0.1.7}/airbyte_agent_amazon_ads/_vendored/connector_sdk/validation.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Amazon Ads changelog
2
2
 
3
+ ## [0.1.7] - 2026-01-23
4
+ - Updated connector definition (YAML version 1.0.2)
5
+ - Source commit: 32c5ef46
6
+ - SDK version: 0.1.0
7
+
8
+ ## [0.1.6] - 2026-01-23
9
+ - Updated connector definition (YAML version 1.0.1)
10
+ - Source commit: 416466da
11
+ - SDK version: 0.1.0
12
+
3
13
  ## [0.1.5] - 2026-01-23
4
14
  - Updated connector definition (YAML version 1.0.1)
5
15
  - Source commit: f17cdd8c
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-amazon-ads
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Airbyte Amazon-Ads 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/
@@ -112,6 +112,7 @@ async def amazon-ads_execute(entity: str, action: str, params: dict | None = Non
112
112
  return await connector.execute(entity, action, params or {})
113
113
  ```
114
114
 
115
+
115
116
  ## Full documentation
116
117
 
117
118
  This connector supports the following entities and actions.
@@ -131,6 +132,6 @@ For the service's official API docs, see the [Amazon-Ads API reference](https://
131
132
 
132
133
  ## Version information
133
134
 
134
- - **Package version:** 0.1.5
135
- - **Connector version:** 1.0.1
136
- - **Generated with Connector SDK commit SHA:** f17cdd8c92950751a75daff9c6bf74df05774ede
135
+ - **Package version:** 0.1.7
136
+ - **Connector version:** 1.0.2
137
+ - **Generated with Connector SDK commit SHA:** 32c5ef4692be2243558faa20132b3ece7d573aed
@@ -79,6 +79,7 @@ async def amazon-ads_execute(entity: str, action: str, params: dict | None = Non
79
79
  return await connector.execute(entity, action, params or {})
80
80
  ```
81
81
 
82
+
82
83
  ## Full documentation
83
84
 
84
85
  This connector supports the following entities and actions.
@@ -98,6 +99,6 @@ For the service's official API docs, see the [Amazon-Ads API reference](https://
98
99
 
99
100
  ## Version information
100
101
 
101
- - **Package version:** 0.1.5
102
- - **Connector version:** 1.0.1
103
- - **Generated with Connector SDK commit SHA:** f17cdd8c92950751a75daff9c6bf74df05774ede
102
+ - **Package version:** 0.1.7
103
+ - **Connector version:** 1.0.2
104
+ - **Generated with Connector SDK commit SHA:** 32c5ef4692be2243558faa20132b3ece7d573aed
@@ -8,7 +8,7 @@ The Amazon-Ads connector supports the following entities and actions.
8
8
 
9
9
  | Entity | Actions |
10
10
  |--------|---------|
11
- | Profiles | [List](#profiles-list), [Get](#profiles-get) |
11
+ | Profiles | [List](#profiles-list), [Get](#profiles-get), [Search](#profiles-search) |
12
12
  | Portfolios | [List](#portfolios-list), [Get](#portfolios-get) |
13
13
  | Sponsored Product Campaigns | [List](#sponsored-product-campaigns-list), [Get](#sponsored-product-campaigns-get) |
14
14
 
@@ -119,6 +119,75 @@ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_i
119
119
  | `accountInfo` | `object \| any` | |
120
120
 
121
121
 
122
+ </details>
123
+
124
+ ### Profiles Search
125
+
126
+ Search and filter profiles records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.
127
+
128
+ #### Python SDK
129
+
130
+ ```python
131
+ await amazon_ads.profiles.search(
132
+ query={"filter": {"eq": {"accountInfo": {}}}}
133
+ )
134
+ ```
135
+
136
+ #### API
137
+
138
+ ```bash
139
+ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_id}/execute' \
140
+ --header 'Content-Type: application/json' \
141
+ --header 'Authorization: Bearer {your_auth_token}' \
142
+ --data '{
143
+ "entity": "profiles",
144
+ "action": "search",
145
+ "params": {
146
+ "query": {"filter": {"eq": {"accountInfo": {}}}}
147
+ }
148
+ }'
149
+ ```
150
+
151
+ #### Parameters
152
+
153
+ | Parameter Name | Type | Required | Description |
154
+ |----------------|------|----------|-------------|
155
+ | `query` | `object` | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
156
+ | `query.filter` | `object` | No | Filter conditions |
157
+ | `query.sort` | `array` | No | Sort conditions |
158
+ | `limit` | `integer` | No | Maximum results to return (default 1000) |
159
+ | `cursor` | `string` | No | Pagination cursor from previous response's next_cursor |
160
+ | `fields` | `array` | No | Field paths to include in results |
161
+
162
+ #### Searchable Fields
163
+
164
+ | Field Name | Type | Description |
165
+ |------------|------|-------------|
166
+ | `accountInfo` | `object` | |
167
+ | `countryCode` | `string` | |
168
+ | `currencyCode` | `string` | |
169
+ | `dailyBudget` | `number` | |
170
+ | `profileId` | `integer` | |
171
+ | `timezone` | `string` | |
172
+
173
+ <details>
174
+ <summary><b>Response Schema</b></summary>
175
+
176
+ | Field Name | Type | Description |
177
+ |------------|------|-------------|
178
+ | `hits` | `array` | List of matching records |
179
+ | `hits[].id` | `string` | Record identifier |
180
+ | `hits[].score` | `number` | Relevance score |
181
+ | `hits[].data` | `object` | Record data containing the searchable fields listed above |
182
+ | `hits[].data.accountInfo` | `object` | |
183
+ | `hits[].data.countryCode` | `string` | |
184
+ | `hits[].data.currencyCode` | `string` | |
185
+ | `hits[].data.dailyBudget` | `number` | |
186
+ | `hits[].data.profileId` | `integer` | |
187
+ | `hits[].data.timezone` | `string` | |
188
+ | `next_cursor` | `string \| null` | Cursor for next page of results |
189
+ | `took_ms` | `number` | Query execution time in milliseconds |
190
+
122
191
  </details>
123
192
 
124
193
  ## Portfolios
@@ -311,3 +380,4 @@ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_i
311
380
 
312
381
  </details>
313
382
 
383
+
@@ -19,7 +19,11 @@ from .models import (
19
19
  AmazonAdsExecuteResultWithMeta,
20
20
  ProfilesListResult,
21
21
  PortfoliosListResult,
22
- SponsoredProductCampaignsListResult
22
+ SponsoredProductCampaignsListResult,
23
+ AirbyteSearchHit,
24
+ AirbyteSearchResult,
25
+ ProfilesSearchData,
26
+ ProfilesSearchResult
23
27
  )
24
28
  from .types import (
25
29
  SponsoredProductCampaignsListParamsStatefilter,
@@ -28,7 +32,12 @@ from .types import (
28
32
  PortfoliosListParams,
29
33
  PortfoliosGetParams,
30
34
  SponsoredProductCampaignsListParams,
31
- SponsoredProductCampaignsGetParams
35
+ SponsoredProductCampaignsGetParams,
36
+ AirbyteSearchParams,
37
+ AirbyteSortOrder,
38
+ ProfilesSearchFilter,
39
+ ProfilesSearchQuery,
40
+ ProfilesCondition
32
41
  )
33
42
 
34
43
  __all__ = [
@@ -47,6 +56,10 @@ __all__ = [
47
56
  "ProfilesListResult",
48
57
  "PortfoliosListResult",
49
58
  "SponsoredProductCampaignsListResult",
59
+ "AirbyteSearchHit",
60
+ "AirbyteSearchResult",
61
+ "ProfilesSearchData",
62
+ "ProfilesSearchResult",
50
63
  "SponsoredProductCampaignsListParamsStatefilter",
51
64
  "ProfilesListParams",
52
65
  "ProfilesGetParams",
@@ -54,4 +67,9 @@ __all__ = [
54
67
  "PortfoliosGetParams",
55
68
  "SponsoredProductCampaignsListParams",
56
69
  "SponsoredProductCampaignsGetParams",
70
+ "AirbyteSearchParams",
71
+ "AirbyteSortOrder",
72
+ "ProfilesSearchFilter",
73
+ "ProfilesSearchQuery",
74
+ "ProfilesCondition",
57
75
  ]
@@ -1032,7 +1032,9 @@ class LocalExecutor:
1032
1032
  if "variables" in graphql_config and graphql_config["variables"]:
1033
1033
  variables = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
1034
1034
  # Filter out None values (optional fields not provided) - matches REST _extract_body() behavior
1035
- body["variables"] = {k: v for k, v in variables.items() if v is not None}
1035
+ # But preserve None for variables explicitly marked as nullable (e.g., to unassign a user)
1036
+ nullable_vars = set(graphql_config.get("x-airbyte-nullable-variables") or [])
1037
+ body["variables"] = {k: v for k, v in variables.items() if v is not None or k in nullable_vars}
1036
1038
 
1037
1039
  # Add operation name if specified
1038
1040
  if "operationName" in graphql_config:
@@ -13,7 +13,7 @@ from uuid import UUID
13
13
  from pydantic import BaseModel, ConfigDict, Field, field_validator
14
14
  from pydantic_core import Url
15
15
 
16
- from .extensions import CacheConfig, RetryConfig
16
+ from .extensions import CacheConfig, ReplicationConfig, RetryConfig
17
17
 
18
18
 
19
19
  class ExampleQuestions(BaseModel):
@@ -106,6 +106,7 @@ class Info(BaseModel):
106
106
  - x-airbyte-retry-config: Retry configuration for transient errors (Airbyte extension)
107
107
  - x-airbyte-example-questions: Example questions for AI connector README (Airbyte extension)
108
108
  - x-airbyte-cache: Cache configuration for field mapping between API and cache schemas (Airbyte extension)
109
+ - x-airbyte-replication-config: Replication configuration for MULTI mode connectors (Airbyte extension)
109
110
  """
110
111
 
111
112
  model_config = ConfigDict(populate_by_name=True, extra="forbid")
@@ -124,6 +125,7 @@ class Info(BaseModel):
124
125
  x_airbyte_retry_config: RetryConfig | None = Field(None, alias="x-airbyte-retry-config")
125
126
  x_airbyte_example_questions: ExampleQuestions | None = Field(None, alias="x-airbyte-example-questions")
126
127
  x_airbyte_cache: CacheConfig | None = Field(None, alias="x-airbyte-cache")
128
+ x_airbyte_replication_config: ReplicationConfig | None = Field(None, alias="x-airbyte-replication-config")
127
129
 
128
130
 
129
131
  class ServerVariable(BaseModel):
@@ -140,6 +142,33 @@ class ServerVariable(BaseModel):
140
142
  description: str | None = None
141
143
 
142
144
 
145
+ class EnvironmentMappingTransform(BaseModel):
146
+ """
147
+ Structured transform for environment mapping values.
148
+
149
+ Allows transforming environment values before storing in source_config.
150
+
151
+ Example:
152
+ source: subdomain
153
+ format: "{value}.atlassian.net"
154
+
155
+ The format string uses {value} as a placeholder for the source value.
156
+ """
157
+
158
+ model_config = ConfigDict(populate_by_name=True, extra="forbid")
159
+
160
+ source: str = Field(description="The environment config key to read the value from")
161
+ format: str | None = Field(
162
+ default=None,
163
+ description="Optional format string to transform the value. Use {value} as placeholder.",
164
+ )
165
+
166
+
167
+ # Type alias for environment mapping values: either a simple string (config key)
168
+ # or a structured transform with source and optional transform template
169
+ EnvironmentMappingValue = str | EnvironmentMappingTransform
170
+
171
+
143
172
  class Server(BaseModel):
144
173
  """
145
174
  Server URL and variable definitions.
@@ -152,7 +181,10 @@ class Server(BaseModel):
152
181
  url: str
153
182
  description: str | None = None
154
183
  variables: Dict[str, ServerVariable] = Field(default_factory=dict)
155
- x_airbyte_replication_environment_mapping: Dict[str, str] | None = Field(default=None, alias="x-airbyte-replication-environment-mapping")
184
+ x_airbyte_replication_environment_mapping: Dict[str, EnvironmentMappingValue] | None = Field(
185
+ default=None,
186
+ alias="x-airbyte-replication-environment-mapping",
187
+ )
156
188
  x_airbyte_replication_environment_constants: Dict[str, Any] | None = Field(
157
189
  default=None,
158
190
  alias="x-airbyte-replication-environment-constants",
@@ -134,6 +134,11 @@ class GraphQLBodyConfig(BaseModel):
134
134
  None,
135
135
  description="Default fields to select if not provided in request parameters. Can be a string or array of field names.",
136
136
  )
137
+ nullable_variables: List[str] | None = Field(
138
+ default=None,
139
+ alias="x-airbyte-nullable-variables",
140
+ description="Variable names that can be explicitly set to null (e.g., to unassign a user)",
141
+ )
137
142
 
138
143
 
139
144
  # Union type for all body type configs (extensible for future types like XML, SOAP, etc.)
@@ -182,6 +182,77 @@ class CacheEntityConfig(BaseModel):
182
182
  return self.x_airbyte_name or self.entity
183
183
 
184
184
 
185
+ class ReplicationConfigProperty(BaseModel):
186
+ """
187
+ Property definition for replication configuration fields.
188
+
189
+ Defines a single field in the replication configuration with its type,
190
+ description, and optional default value.
191
+
192
+ Example YAML usage:
193
+ x-airbyte-replication-config:
194
+ properties:
195
+ start_date:
196
+ type: string
197
+ title: Start Date
198
+ description: UTC date and time from which to replicate data
199
+ format: date-time
200
+ """
201
+
202
+ model_config = ConfigDict(populate_by_name=True, extra="forbid")
203
+
204
+ type: str
205
+ title: str | None = None
206
+ description: str | None = None
207
+ format: str | None = None
208
+ default: str | int | float | bool | None = None
209
+ enum: list[str] | None = None
210
+
211
+
212
+ class ReplicationConfig(BaseModel):
213
+ """
214
+ Replication configuration extension (x-airbyte-replication-config).
215
+
216
+ Defines replication-specific settings for MULTI mode connectors that need
217
+ to configure the underlying replication connector. This allows users who
218
+ use the direct-style API (credentials + environment) to also specify
219
+ replication settings like start_date, lookback_window, etc.
220
+
221
+ This extension is added to the Info model and provides field definitions
222
+ for replication configuration that gets merged into the source config
223
+ when creating sources.
224
+
225
+ Example YAML usage:
226
+ info:
227
+ title: HubSpot API
228
+ x-airbyte-replication-config:
229
+ title: Replication Configuration
230
+ description: Settings for data replication
231
+ properties:
232
+ start_date:
233
+ type: string
234
+ title: Start Date
235
+ description: UTC date and time from which to replicate data
236
+ format: date-time
237
+ required:
238
+ - start_date
239
+ replication_config_key_mapping:
240
+ start_date: start_date
241
+ """
242
+
243
+ model_config = ConfigDict(populate_by_name=True, extra="forbid")
244
+
245
+ title: str | None = None
246
+ description: str | None = None
247
+ properties: dict[str, ReplicationConfigProperty] = Field(default_factory=dict)
248
+ required: list[str] = Field(default_factory=list)
249
+ replication_config_key_mapping: dict[str, str] = Field(
250
+ default_factory=dict,
251
+ alias="replication_config_key_mapping",
252
+ description="Mapping from replication_config field names to source_config field names",
253
+ )
254
+
255
+
185
256
  class CacheConfig(BaseModel):
186
257
  """
187
258
  Cache configuration extension (x-airbyte-cache).
@@ -21,6 +21,9 @@ from .types import (
21
21
  SponsoredProductCampaignsGetParams,
22
22
  SponsoredProductCampaignsListParams,
23
23
  SponsoredProductCampaignsListParamsStatefilter,
24
+ AirbyteSearchParams,
25
+ ProfilesSearchFilter,
26
+ ProfilesSearchQuery,
24
27
  )
25
28
  if TYPE_CHECKING:
26
29
  from .models import AmazonAdsAuthConfig
@@ -34,6 +37,10 @@ from .models import (
34
37
  Portfolio,
35
38
  Profile,
36
39
  SponsoredProductCampaign,
40
+ AirbyteSearchHit,
41
+ AirbyteSearchResult,
42
+ ProfilesSearchData,
43
+ ProfilesSearchResult,
37
44
  )
38
45
 
39
46
  # TypeVar for decorator type preservation
@@ -49,7 +56,7 @@ class AmazonAdsConnector:
49
56
  """
50
57
 
51
58
  connector_name = "amazon-ads"
52
- connector_version = "1.0.1"
59
+ connector_version = "1.0.2"
53
60
  vendored_sdk_version = "0.1.0" # Version of vendored connector-sdk
54
61
 
55
62
  # Map of (entity, action) -> needs_envelope for envelope wrapping decision
@@ -441,6 +448,65 @@ information about the advertiser's account in a specific marketplace.
441
448
 
442
449
 
443
450
 
451
+ async def search(
452
+ self,
453
+ query: ProfilesSearchQuery,
454
+ limit: int | None = None,
455
+ cursor: str | None = None,
456
+ fields: list[list[str]] | None = None,
457
+ ) -> ProfilesSearchResult:
458
+ """
459
+ Search profiles records from Airbyte cache.
460
+
461
+ This operation searches cached data from Airbyte syncs.
462
+ Only available in hosted execution mode.
463
+
464
+ Available filter fields (ProfilesSearchFilter):
465
+ - account_info:
466
+ - country_code:
467
+ - currency_code:
468
+ - daily_budget:
469
+ - profile_id:
470
+ - timezone:
471
+
472
+ Args:
473
+ query: Filter and sort conditions. Supports operators like eq, neq, gt, gte, lt, lte,
474
+ in, like, fuzzy, keyword, not, and, or. Example: {"filter": {"eq": {"status": "active"}}}
475
+ limit: Maximum results to return (default 1000)
476
+ cursor: Pagination cursor from previous response's next_cursor
477
+ fields: Field paths to include in results. Each path is a list of keys for nested access.
478
+ Example: [["id"], ["user", "name"]] returns id and user.name fields.
479
+
480
+ Returns:
481
+ ProfilesSearchResult with hits (list of AirbyteSearchHit[ProfilesSearchData]) and pagination info
482
+
483
+ Raises:
484
+ NotImplementedError: If called in local execution mode
485
+ """
486
+ params: dict[str, Any] = {"query": query}
487
+ if limit is not None:
488
+ params["limit"] = limit
489
+ if cursor is not None:
490
+ params["cursor"] = cursor
491
+ if fields is not None:
492
+ params["fields"] = fields
493
+
494
+ result = await self._connector.execute("profiles", "search", params)
495
+
496
+ # Parse response into typed result
497
+ return ProfilesSearchResult(
498
+ hits=[
499
+ AirbyteSearchHit[ProfilesSearchData](
500
+ id=hit.get("id"),
501
+ score=hit.get("score"),
502
+ data=ProfilesSearchData(**hit.get("data", {}))
503
+ )
504
+ for hit in result.get("hits", [])
505
+ ],
506
+ next_cursor=result.get("next_cursor"),
507
+ took_ms=result.get("took_ms")
508
+ )
509
+
444
510
  class PortfoliosQuery:
445
511
  """
446
512
  Query class for Portfolios entity operations.
@@ -26,7 +26,7 @@ from uuid import (
26
26
  AmazonAdsConnectorModel: ConnectorModel = ConnectorModel(
27
27
  id=UUID('c6b0a29e-1da9-4512-9002-7bfd0cba2246'),
28
28
  name='amazon-ads',
29
- version='1.0.1',
29
+ version='1.0.2',
30
30
  base_url='{region_url}',
31
31
  auth=AuthConfig(
32
32
  type=AuthType.OAUTH2,
@@ -152,6 +152,61 @@ class AmazonAdsExecuteResultWithMeta(AmazonAdsExecuteResult[T], Generic[T, S]):
152
152
  meta: S
153
153
  """Metadata about the response (e.g., pagination cursors, record counts)."""
154
154
 
155
+ # ===== SEARCH DATA MODELS =====
156
+ # Entity-specific Pydantic models for search result data
157
+
158
+ # Type variable for search data generic
159
+ D = TypeVar('D')
160
+
161
+ class ProfilesSearchData(BaseModel):
162
+ """Search result data for profiles entity."""
163
+ model_config = ConfigDict(extra="allow")
164
+
165
+ account_info: dict[str, Any] | None = None
166
+ """"""
167
+ country_code: str | None = None
168
+ """"""
169
+ currency_code: str | None = None
170
+ """"""
171
+ daily_budget: float | None = None
172
+ """"""
173
+ profile_id: int | None = None
174
+ """"""
175
+ timezone: str | None = None
176
+ """"""
177
+
178
+
179
+ # ===== GENERIC SEARCH RESULT TYPES =====
180
+
181
+ class AirbyteSearchHit(BaseModel, Generic[D]):
182
+ """A single search result with typed data."""
183
+ model_config = ConfigDict(extra="allow")
184
+
185
+ id: str | None = None
186
+ """Unique identifier for the record."""
187
+ score: float | None = None
188
+ """Relevance score for the match."""
189
+ data: D
190
+ """The matched record data."""
191
+
192
+
193
+ class AirbyteSearchResult(BaseModel, Generic[D]):
194
+ """Result from Airbyte cache search operations with typed hits."""
195
+ model_config = ConfigDict(extra="allow")
196
+
197
+ hits: list[AirbyteSearchHit[D]] = Field(default_factory=list)
198
+ """List of matching records."""
199
+ next_cursor: str | None = None
200
+ """Cursor for fetching the next page of results."""
201
+ took_ms: int | None = None
202
+ """Time taken to execute the search in milliseconds."""
203
+
204
+
205
+ # ===== ENTITY-SPECIFIC SEARCH RESULT TYPE ALIASES =====
206
+
207
+ ProfilesSearchResult = AirbyteSearchResult[ProfilesSearchData]
208
+ """Search result type for profiles entity."""
209
+
155
210
 
156
211
 
157
212
  # ===== OPERATION RESULT TYPE ALIASES =====
@@ -0,0 +1,238 @@
1
+ """
2
+ Type definitions for amazon-ads connector.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ # Use typing_extensions.TypedDict for Pydantic compatibility
7
+ try:
8
+ from typing_extensions import TypedDict, NotRequired
9
+ except ImportError:
10
+ from typing import TypedDict, NotRequired # type: ignore[attr-defined]
11
+
12
+ from typing import Any, Literal
13
+
14
+
15
+ # ===== NESTED PARAM TYPE DEFINITIONS =====
16
+ # Nested parameter schemas discovered during parameter extraction
17
+
18
+ class SponsoredProductCampaignsListParamsStatefilter(TypedDict):
19
+ """Nested schema for SponsoredProductCampaignsListParams.stateFilter"""
20
+ include: NotRequired[str]
21
+
22
+ # ===== OPERATION PARAMS TYPE DEFINITIONS =====
23
+
24
+ class ProfilesListParams(TypedDict):
25
+ """Parameters for profiles.list operation"""
26
+ profile_type_filter: NotRequired[str]
27
+
28
+ class ProfilesGetParams(TypedDict):
29
+ """Parameters for profiles.get operation"""
30
+ profile_id: str
31
+
32
+ class PortfoliosListParams(TypedDict):
33
+ """Parameters for portfolios.list operation"""
34
+ include_extended_data_fields: NotRequired[str]
35
+
36
+ class PortfoliosGetParams(TypedDict):
37
+ """Parameters for portfolios.get operation"""
38
+ portfolio_id: str
39
+
40
+ class SponsoredProductCampaignsListParams(TypedDict):
41
+ """Parameters for sponsored_product_campaigns.list operation"""
42
+ state_filter: NotRequired[SponsoredProductCampaignsListParamsStatefilter]
43
+ max_results: NotRequired[int]
44
+ next_token: NotRequired[str]
45
+
46
+ class SponsoredProductCampaignsGetParams(TypedDict):
47
+ """Parameters for sponsored_product_campaigns.get operation"""
48
+ campaign_id: str
49
+
50
+ # ===== SEARCH TYPES =====
51
+
52
+ # Sort specification
53
+ AirbyteSortOrder = Literal["asc", "desc"]
54
+
55
+ # ===== PROFILES SEARCH TYPES =====
56
+
57
+ class ProfilesSearchFilter(TypedDict, total=False):
58
+ """Available fields for filtering profiles search queries."""
59
+ account_info: dict[str, Any] | None
60
+ """"""
61
+ country_code: str | None
62
+ """"""
63
+ currency_code: str | None
64
+ """"""
65
+ daily_budget: float | None
66
+ """"""
67
+ profile_id: int | None
68
+ """"""
69
+ timezone: str | None
70
+ """"""
71
+
72
+
73
+ class ProfilesInFilter(TypedDict, total=False):
74
+ """Available fields for 'in' condition (values are lists)."""
75
+ account_info: list[dict[str, Any]]
76
+ """"""
77
+ country_code: list[str]
78
+ """"""
79
+ currency_code: list[str]
80
+ """"""
81
+ daily_budget: list[float]
82
+ """"""
83
+ profile_id: list[int]
84
+ """"""
85
+ timezone: list[str]
86
+ """"""
87
+
88
+
89
+ class ProfilesAnyValueFilter(TypedDict, total=False):
90
+ """Available fields with Any value type. Used for 'contains' and 'any' conditions."""
91
+ account_info: Any
92
+ """"""
93
+ country_code: Any
94
+ """"""
95
+ currency_code: Any
96
+ """"""
97
+ daily_budget: Any
98
+ """"""
99
+ profile_id: Any
100
+ """"""
101
+ timezone: Any
102
+ """"""
103
+
104
+
105
+ class ProfilesStringFilter(TypedDict, total=False):
106
+ """String fields for text search conditions (like, fuzzy, keyword)."""
107
+ account_info: str
108
+ """"""
109
+ country_code: str
110
+ """"""
111
+ currency_code: str
112
+ """"""
113
+ daily_budget: str
114
+ """"""
115
+ profile_id: str
116
+ """"""
117
+ timezone: str
118
+ """"""
119
+
120
+
121
+ class ProfilesSortFilter(TypedDict, total=False):
122
+ """Available fields for sorting profiles search results."""
123
+ account_info: AirbyteSortOrder
124
+ """"""
125
+ country_code: AirbyteSortOrder
126
+ """"""
127
+ currency_code: AirbyteSortOrder
128
+ """"""
129
+ daily_budget: AirbyteSortOrder
130
+ """"""
131
+ profile_id: AirbyteSortOrder
132
+ """"""
133
+ timezone: AirbyteSortOrder
134
+ """"""
135
+
136
+
137
+ # Entity-specific condition types for profiles
138
+ class ProfilesEqCondition(TypedDict, total=False):
139
+ """Equal to: field equals value."""
140
+ eq: ProfilesSearchFilter
141
+
142
+
143
+ class ProfilesNeqCondition(TypedDict, total=False):
144
+ """Not equal to: field does not equal value."""
145
+ neq: ProfilesSearchFilter
146
+
147
+
148
+ class ProfilesGtCondition(TypedDict, total=False):
149
+ """Greater than: field > value."""
150
+ gt: ProfilesSearchFilter
151
+
152
+
153
+ class ProfilesGteCondition(TypedDict, total=False):
154
+ """Greater than or equal: field >= value."""
155
+ gte: ProfilesSearchFilter
156
+
157
+
158
+ class ProfilesLtCondition(TypedDict, total=False):
159
+ """Less than: field < value."""
160
+ lt: ProfilesSearchFilter
161
+
162
+
163
+ class ProfilesLteCondition(TypedDict, total=False):
164
+ """Less than or equal: field <= value."""
165
+ lte: ProfilesSearchFilter
166
+
167
+
168
+ class ProfilesLikeCondition(TypedDict, total=False):
169
+ """Partial string match with % wildcards."""
170
+ like: ProfilesStringFilter
171
+
172
+
173
+ class ProfilesFuzzyCondition(TypedDict, total=False):
174
+ """Ordered word text match (case-insensitive)."""
175
+ fuzzy: ProfilesStringFilter
176
+
177
+
178
+ class ProfilesKeywordCondition(TypedDict, total=False):
179
+ """Keyword text match (any word present)."""
180
+ keyword: ProfilesStringFilter
181
+
182
+
183
+ class ProfilesContainsCondition(TypedDict, total=False):
184
+ """Check if value exists in array field. Example: {"contains": {"tags": "premium"}}"""
185
+ contains: ProfilesAnyValueFilter
186
+
187
+
188
+ # Reserved keyword conditions using functional TypedDict syntax
189
+ ProfilesInCondition = TypedDict("ProfilesInCondition", {"in": ProfilesInFilter}, total=False)
190
+ """In list: field value is in list. Example: {"in": {"status": ["active", "pending"]}}"""
191
+
192
+ ProfilesNotCondition = TypedDict("ProfilesNotCondition", {"not": "ProfilesCondition"}, total=False)
193
+ """Negates the nested condition."""
194
+
195
+ ProfilesAndCondition = TypedDict("ProfilesAndCondition", {"and": "list[ProfilesCondition]"}, total=False)
196
+ """True if all nested conditions are true."""
197
+
198
+ ProfilesOrCondition = TypedDict("ProfilesOrCondition", {"or": "list[ProfilesCondition]"}, total=False)
199
+ """True if any nested condition is true."""
200
+
201
+ ProfilesAnyCondition = TypedDict("ProfilesAnyCondition", {"any": ProfilesAnyValueFilter}, total=False)
202
+ """Match if ANY element in array field matches nested condition. Example: {"any": {"addresses": {"eq": {"state": "CA"}}}}"""
203
+
204
+ # Union of all profiles condition types
205
+ ProfilesCondition = (
206
+ ProfilesEqCondition
207
+ | ProfilesNeqCondition
208
+ | ProfilesGtCondition
209
+ | ProfilesGteCondition
210
+ | ProfilesLtCondition
211
+ | ProfilesLteCondition
212
+ | ProfilesInCondition
213
+ | ProfilesLikeCondition
214
+ | ProfilesFuzzyCondition
215
+ | ProfilesKeywordCondition
216
+ | ProfilesContainsCondition
217
+ | ProfilesNotCondition
218
+ | ProfilesAndCondition
219
+ | ProfilesOrCondition
220
+ | ProfilesAnyCondition
221
+ )
222
+
223
+
224
+ class ProfilesSearchQuery(TypedDict, total=False):
225
+ """Search query for profiles entity."""
226
+ filter: ProfilesCondition
227
+ sort: list[ProfilesSortFilter]
228
+
229
+
230
+
231
+ # ===== SEARCH PARAMS =====
232
+
233
+ class AirbyteSearchParams(TypedDict, total=False):
234
+ """Parameters for Airbyte cache search operations (generic, use entity-specific query types for better type hints)."""
235
+ query: dict[str, Any]
236
+ limit: int
237
+ cursor: str
238
+ fields: list[list[str]]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "airbyte-agent-amazon-ads"
3
- version = "0.1.5"
3
+ version = "0.1.7"
4
4
  description = "Airbyte Amazon-Ads Connector for AI platforms"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -1,48 +0,0 @@
1
- """
2
- Type definitions for amazon-ads connector.
3
- """
4
- from __future__ import annotations
5
-
6
- # Use typing_extensions.TypedDict for Pydantic compatibility
7
- try:
8
- from typing_extensions import TypedDict, NotRequired
9
- except ImportError:
10
- from typing import TypedDict, NotRequired # type: ignore[attr-defined]
11
-
12
-
13
-
14
- # ===== NESTED PARAM TYPE DEFINITIONS =====
15
- # Nested parameter schemas discovered during parameter extraction
16
-
17
- class SponsoredProductCampaignsListParamsStatefilter(TypedDict):
18
- """Nested schema for SponsoredProductCampaignsListParams.stateFilter"""
19
- include: NotRequired[str]
20
-
21
- # ===== OPERATION PARAMS TYPE DEFINITIONS =====
22
-
23
- class ProfilesListParams(TypedDict):
24
- """Parameters for profiles.list operation"""
25
- profile_type_filter: NotRequired[str]
26
-
27
- class ProfilesGetParams(TypedDict):
28
- """Parameters for profiles.get operation"""
29
- profile_id: str
30
-
31
- class PortfoliosListParams(TypedDict):
32
- """Parameters for portfolios.list operation"""
33
- include_extended_data_fields: NotRequired[str]
34
-
35
- class PortfoliosGetParams(TypedDict):
36
- """Parameters for portfolios.get operation"""
37
- portfolio_id: str
38
-
39
- class SponsoredProductCampaignsListParams(TypedDict):
40
- """Parameters for sponsored_product_campaigns.list operation"""
41
- state_filter: NotRequired[SponsoredProductCampaignsListParamsStatefilter]
42
- max_results: NotRequired[int]
43
- next_token: NotRequired[str]
44
-
45
- class SponsoredProductCampaignsGetParams(TypedDict):
46
- """Parameters for sponsored_product_campaigns.get operation"""
47
- campaign_id: str
48
-