airbyte-agent-mailchimp 0.1.4__py3-none-any.whl → 0.1.7__py3-none-any.whl

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.
@@ -7,44 +7,44 @@ Auto-generated from OpenAPI specification.
7
7
  from .connector import MailchimpConnector
8
8
  from .models import (
9
9
  MailchimpAuthConfig,
10
+ CampaignDeliveryStatus,
10
11
  CampaignRecipients,
11
- CampaignTracking,
12
12
  CampaignSettings,
13
- CampaignDeliveryStatus,
14
13
  CampaignReportSummaryEcommerce,
15
14
  CampaignReportSummary,
15
+ CampaignTracking,
16
16
  Campaign,
17
17
  CampaignsList,
18
+ ListStats,
18
19
  ListCampaignDefaults,
19
20
  ListContact,
20
- ListStats,
21
21
  List,
22
22
  ListsList,
23
23
  ListMemberStatsEcommerceData,
24
24
  ListMemberStats,
25
- ListMemberLocation,
26
25
  ListMemberTagsItem,
26
+ ListMemberLocation,
27
27
  ListMember,
28
28
  ListMembersList,
29
- ReportListStats,
30
- ReportEcommerce,
31
- ReportFacebookLikes,
32
- ReportIndustryStats,
33
29
  ReportOpens,
34
- ReportBounces,
35
- ReportDeliveryStatus,
36
30
  ReportForwards,
37
31
  ReportClicks,
32
+ ReportDeliveryStatus,
33
+ ReportIndustryStats,
34
+ ReportFacebookLikes,
35
+ ReportEcommerce,
36
+ ReportListStats,
37
+ ReportBounces,
38
38
  Report,
39
39
  ReportsList,
40
40
  EmailActivityActivityItem,
41
41
  EmailActivity,
42
42
  EmailActivityList,
43
43
  AutomationReportSummary,
44
- AutomationTracking,
44
+ AutomationSettings,
45
45
  AutomationRecipientsSegmentOpts,
46
46
  AutomationRecipients,
47
- AutomationSettings,
47
+ AutomationTracking,
48
48
  Automation,
49
49
  AutomationsList,
50
50
  Tag,
@@ -114,44 +114,44 @@ from .types import (
114
114
  __all__ = [
115
115
  "MailchimpConnector",
116
116
  "MailchimpAuthConfig",
117
+ "CampaignDeliveryStatus",
117
118
  "CampaignRecipients",
118
- "CampaignTracking",
119
119
  "CampaignSettings",
120
- "CampaignDeliveryStatus",
121
120
  "CampaignReportSummaryEcommerce",
122
121
  "CampaignReportSummary",
122
+ "CampaignTracking",
123
123
  "Campaign",
124
124
  "CampaignsList",
125
+ "ListStats",
125
126
  "ListCampaignDefaults",
126
127
  "ListContact",
127
- "ListStats",
128
128
  "List",
129
129
  "ListsList",
130
130
  "ListMemberStatsEcommerceData",
131
131
  "ListMemberStats",
132
- "ListMemberLocation",
133
132
  "ListMemberTagsItem",
133
+ "ListMemberLocation",
134
134
  "ListMember",
135
135
  "ListMembersList",
136
- "ReportListStats",
137
- "ReportEcommerce",
138
- "ReportFacebookLikes",
139
- "ReportIndustryStats",
140
136
  "ReportOpens",
141
- "ReportBounces",
142
- "ReportDeliveryStatus",
143
137
  "ReportForwards",
144
138
  "ReportClicks",
139
+ "ReportDeliveryStatus",
140
+ "ReportIndustryStats",
141
+ "ReportFacebookLikes",
142
+ "ReportEcommerce",
143
+ "ReportListStats",
144
+ "ReportBounces",
145
145
  "Report",
146
146
  "ReportsList",
147
147
  "EmailActivityActivityItem",
148
148
  "EmailActivity",
149
149
  "EmailActivityList",
150
150
  "AutomationReportSummary",
151
- "AutomationTracking",
151
+ "AutomationSettings",
152
152
  "AutomationRecipientsSegmentOpts",
153
153
  "AutomationRecipients",
154
- "AutomationSettings",
154
+ "AutomationTracking",
155
155
  "Automation",
156
156
  "AutomationsList",
157
157
  "Tag",
@@ -987,7 +987,9 @@ class LocalExecutor:
987
987
 
988
988
  # Substitute variables from params
989
989
  if "variables" in graphql_config and graphql_config["variables"]:
990
- body["variables"] = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
990
+ variables = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
991
+ # Filter out None values (optional fields not provided) - matches REST _extract_body() behavior
992
+ body["variables"] = {k: v for k, v in variables.items() if v is not None}
991
993
 
992
994
  # Add operation name if specified
993
995
  if "operationName" in graphql_config:
@@ -1222,15 +1224,22 @@ class LocalExecutor:
1222
1224
  def _extract_metadata(
1223
1225
  self,
1224
1226
  response_data: dict[str, Any],
1227
+ response_headers: dict[str, str],
1225
1228
  endpoint: EndpointDefinition,
1226
1229
  ) -> dict[str, Any] | None:
1227
1230
  """Extract metadata from response using meta extractor.
1228
1231
 
1229
- Each field in meta_extractor dict is independently extracted using JSONPath.
1232
+ Each field in meta_extractor dict is independently extracted using JSONPath
1233
+ for body extraction, or special prefixes for header extraction:
1234
+ - @link.{rel}: Extract URL from RFC 5988 Link header by rel type
1235
+ - @header.{name}: Extract raw header value by header name
1236
+ - Otherwise: JSONPath expression for body extraction
1237
+
1230
1238
  Missing or invalid paths result in None for that field (no crash).
1231
1239
 
1232
1240
  Args:
1233
1241
  response_data: Full API response (before record extraction)
1242
+ response_headers: HTTP response headers
1234
1243
  endpoint: Endpoint with optional meta extractor configuration
1235
1244
 
1236
1245
  Returns:
@@ -1241,11 +1250,15 @@ class LocalExecutor:
1241
1250
  Example:
1242
1251
  meta_extractor = {
1243
1252
  "pagination": "$.records",
1244
- "request_id": "$.requestId"
1253
+ "request_id": "$.requestId",
1254
+ "next_page_url": "@link.next",
1255
+ "rate_limit": "@header.X-RateLimit-Remaining"
1245
1256
  }
1246
1257
  Returns: {
1247
1258
  "pagination": {"cursor": "abc", "total": 100},
1248
- "request_id": "xyz123"
1259
+ "request_id": "xyz123",
1260
+ "next_page_url": "https://api.example.com/data?cursor=abc",
1261
+ "rate_limit": "99"
1249
1262
  }
1250
1263
  """
1251
1264
  # Check if endpoint has meta extractor
@@ -1255,26 +1268,96 @@ class LocalExecutor:
1255
1268
  extracted_meta: dict[str, Any] = {}
1256
1269
 
1257
1270
  # Extract each field independently
1258
- for field_name, jsonpath_expr_str in endpoint.meta_extractor.items():
1271
+ for field_name, extractor_expr in endpoint.meta_extractor.items():
1259
1272
  try:
1260
- # Parse and apply JSONPath expression
1261
- jsonpath_expr = parse_jsonpath(jsonpath_expr_str)
1262
- matches = [match.value for match in jsonpath_expr.find(response_data)]
1263
-
1264
- if matches:
1265
- # Return first match (most common case)
1266
- extracted_meta[field_name] = matches[0]
1273
+ if extractor_expr.startswith("@link."):
1274
+ # RFC 5988 Link header extraction
1275
+ rel = extractor_expr[6:]
1276
+ extracted_meta[field_name] = self._extract_link_url(response_headers, rel)
1277
+ elif extractor_expr.startswith("@header."):
1278
+ # Raw header value extraction (case-insensitive lookup)
1279
+ header_name = extractor_expr[8:]
1280
+ extracted_meta[field_name] = self._get_header_value(response_headers, header_name)
1267
1281
  else:
1268
- # Path not found - set to None
1269
- extracted_meta[field_name] = None
1282
+ # JSONPath body extraction
1283
+ jsonpath_expr = parse_jsonpath(extractor_expr)
1284
+ matches = [match.value for match in jsonpath_expr.find(response_data)]
1285
+
1286
+ if matches:
1287
+ # Return first match (most common case)
1288
+ extracted_meta[field_name] = matches[0]
1289
+ else:
1290
+ # Path not found - set to None
1291
+ extracted_meta[field_name] = None
1270
1292
 
1271
1293
  except Exception as e:
1272
1294
  # Log error but continue with other fields
1273
- logging.warning(f"Failed to apply meta extractor for field '{field_name}' with path '{jsonpath_expr_str}': {e}. Setting to None.")
1295
+ logging.warning(f"Failed to apply meta extractor for field '{field_name}' with expression '{extractor_expr}': {e}. Setting to None.")
1274
1296
  extracted_meta[field_name] = None
1275
1297
 
1276
1298
  return extracted_meta
1277
1299
 
1300
+ @staticmethod
1301
+ def _extract_link_url(headers: dict[str, str], rel: str) -> str | None:
1302
+ """Extract URL from RFC 5988 Link header by rel type.
1303
+
1304
+ Parses Link header format: <url>; param1="value1"; rel="next"; param2="value2"
1305
+
1306
+ Supports:
1307
+ - Multiple parameters per link in any order
1308
+ - Both quoted and unquoted rel values
1309
+ - Multiple links separated by commas
1310
+
1311
+ Args:
1312
+ headers: Response headers dict
1313
+ rel: The rel type to extract (e.g., "next", "prev", "first", "last")
1314
+
1315
+ Returns:
1316
+ The URL for the specified rel type, or None if not found
1317
+ """
1318
+ link_header = headers.get("Link") or headers.get("link", "")
1319
+ if not link_header:
1320
+ return None
1321
+
1322
+ for link_segment in re.split(r",(?=\s*<)", link_header):
1323
+ link_segment = link_segment.strip()
1324
+
1325
+ url_match = re.match(r"<([^>]+)>", link_segment)
1326
+ if not url_match:
1327
+ continue
1328
+
1329
+ url = url_match.group(1)
1330
+ params_str = link_segment[url_match.end() :]
1331
+
1332
+ rel_match = re.search(r';\s*rel="?([^";,]+)"?', params_str, re.IGNORECASE)
1333
+ if rel_match and rel_match.group(1).strip() == rel:
1334
+ return url
1335
+
1336
+ return None
1337
+
1338
+ @staticmethod
1339
+ def _get_header_value(headers: dict[str, str], header_name: str) -> str | None:
1340
+ """Get header value with case-insensitive lookup.
1341
+
1342
+ Args:
1343
+ headers: Response headers dict
1344
+ header_name: Header name to look up
1345
+
1346
+ Returns:
1347
+ Header value or None if not found
1348
+ """
1349
+ # Try exact match first
1350
+ if header_name in headers:
1351
+ return headers[header_name]
1352
+
1353
+ # Case-insensitive lookup
1354
+ header_name_lower = header_name.lower()
1355
+ for key, value in headers.items():
1356
+ if key.lower() == header_name_lower:
1357
+ return value
1358
+
1359
+ return None
1360
+
1278
1361
  def _validate_required_body_fields(self, endpoint: Any, params: dict[str, Any], action: Action, entity: str) -> None:
1279
1362
  """Validate that required body fields are present for CREATE/UPDATE operations.
1280
1363
 
@@ -1402,7 +1485,7 @@ class _StandardOperationHandler:
1402
1485
  request_kwargs = self.ctx.determine_request_format(endpoint, body)
1403
1486
 
1404
1487
  # Execute async HTTP request
1405
- response = await self.ctx.http_client.request(
1488
+ response_data, response_headers = await self.ctx.http_client.request(
1406
1489
  method=endpoint.method,
1407
1490
  path=path,
1408
1491
  params=query_params if query_params else None,
@@ -1411,10 +1494,10 @@ class _StandardOperationHandler:
1411
1494
  )
1412
1495
 
1413
1496
  # Extract metadata from original response (before record extraction)
1414
- metadata = self.ctx.executor._extract_metadata(response, endpoint)
1497
+ metadata = self.ctx.executor._extract_metadata(response_data, response_headers, endpoint)
1415
1498
 
1416
1499
  # Extract records if extractor configured
1417
- response = self.ctx.extract_records(response, endpoint)
1500
+ response = self.ctx.extract_records(response_data, endpoint)
1418
1501
 
1419
1502
  # Assume success with 200 status code if no exception raised
1420
1503
  status_code = 200
@@ -1540,7 +1623,7 @@ class _DownloadOperationHandler:
1540
1623
  request_format = self.ctx.determine_request_format(operation, request_body)
1541
1624
  self.ctx.validate_required_body_fields(operation, params, action, entity)
1542
1625
 
1543
- metadata_response = await self.ctx.http_client.request(
1626
+ metadata_response, _ = await self.ctx.http_client.request(
1544
1627
  method=operation.method,
1545
1628
  path=path,
1546
1629
  params=query_params,
@@ -1555,7 +1638,7 @@ class _DownloadOperationHandler:
1555
1638
  )
1556
1639
 
1557
1640
  # Step 3: Stream file from extracted URL
1558
- file_response = await self.ctx.http_client.request(
1641
+ file_response, _ = await self.ctx.http_client.request(
1559
1642
  method="GET",
1560
1643
  path=file_url,
1561
1644
  headers=headers,
@@ -1563,7 +1646,7 @@ class _DownloadOperationHandler:
1563
1646
  )
1564
1647
  else:
1565
1648
  # One-step direct download: stream file directly from endpoint
1566
- file_response = await self.ctx.http_client.request(
1649
+ file_response, _ = await self.ctx.http_client.request(
1567
1650
  method=operation.method,
1568
1651
  path=path,
1569
1652
  params=query_params,
@@ -421,10 +421,14 @@ class HTTPClient:
421
421
  headers: dict[str, str] | None = None,
422
422
  *,
423
423
  stream: bool = False,
424
- ):
424
+ ) -> tuple[dict[str, Any], dict[str, str]]:
425
425
  """Execute a single HTTP request attempt (no retries).
426
426
 
427
427
  This is the core request logic, separated from retry handling.
428
+
429
+ Returns:
430
+ Tuple of (response_data, response_headers) for non-streaming requests.
431
+ For streaming requests, returns (response_object, response_headers).
428
432
  """
429
433
  # Ensure auth credentials are initialized (proactive refresh if needed)
430
434
  await self._ensure_auth_initialized()
@@ -474,8 +478,9 @@ class HTTPClient:
474
478
  request_id=request_id,
475
479
  status_code=status_code,
476
480
  response_body=f"<binary content, {response.headers.get('content-length', 'unknown')} bytes>",
481
+ response_headers=dict(response.headers),
477
482
  )
478
- return response
483
+ return response, dict(response.headers)
479
484
 
480
485
  # Parse response - handle non-JSON responses gracefully
481
486
  content_type = response.headers.get("content-type", "")
@@ -500,8 +505,9 @@ class HTTPClient:
500
505
  request_id=request_id,
501
506
  status_code=status_code,
502
507
  response_body=response_data,
508
+ response_headers=dict(response.headers),
503
509
  )
504
- return response_data
510
+ return response_data, dict(response.headers)
505
511
 
506
512
  except AuthenticationError as e:
507
513
  # Auth error (401, 403) - handle token refresh
@@ -631,7 +637,7 @@ class HTTPClient:
631
637
  *,
632
638
  stream: bool = False,
633
639
  _auth_retry_attempted: bool = False,
634
- ):
640
+ ) -> tuple[dict[str, Any], dict[str, str]]:
635
641
  """Make an async HTTP request with optional streaming and automatic retries.
636
642
 
637
643
  Args:
@@ -644,8 +650,9 @@ class HTTPClient:
644
650
  stream: If True, do not eagerly read the body (useful for downloads)
645
651
 
646
652
  Returns:
647
- - If stream=False: Parsed JSON (dict) or empty dict
648
- - If stream=True: Response object suitable for streaming
653
+ Tuple of (response_data, response_headers):
654
+ - If stream=False: (parsed JSON dict or empty dict, response headers dict)
655
+ - If stream=True: (response object suitable for streaming, response headers dict)
649
656
 
650
657
  Raises:
651
658
  HTTPStatusError: If request fails with 4xx/5xx status after all retries
@@ -134,6 +134,7 @@ class RequestLogger:
134
134
  request_id: str,
135
135
  status_code: int,
136
136
  response_body: Any | None = None,
137
+ response_headers: Dict[str, str] | None = None,
137
138
  ) -> None:
138
139
  """
139
140
  Log a successful HTTP response.
@@ -142,6 +143,7 @@ class RequestLogger:
142
143
  request_id: ID returned from log_request
143
144
  status_code: HTTP status code
144
145
  response_body: Response body
146
+ response_headers: Response headers
145
147
  """
146
148
  if request_id not in self._active_requests:
147
149
  return
@@ -166,6 +168,7 @@ class RequestLogger:
166
168
  body=request_data["body"],
167
169
  response_status=status_code,
168
170
  response_body=serializable_body,
171
+ response_headers=response_headers or {},
169
172
  timing_ms=timing_ms,
170
173
  )
171
174
 
@@ -243,7 +246,13 @@ class NullLogger:
243
246
  """No-op log_request."""
244
247
  return ""
245
248
 
246
- def log_response(self, *args, **kwargs) -> None:
249
+ def log_response(
250
+ self,
251
+ request_id: str,
252
+ status_code: int,
253
+ response_body: Any | None = None,
254
+ response_headers: Dict[str, str] | None = None,
255
+ ) -> None:
247
256
  """No-op log_response."""
248
257
  pass
249
258
 
@@ -31,6 +31,7 @@ class RequestLog(BaseModel):
31
31
  body: Any | None = None
32
32
  response_status: int | None = None
33
33
  response_body: Any | None = None
34
+ response_headers: Dict[str, str] = Field(default_factory=dict)
34
35
  timing_ms: float | None = None
35
36
  error: str | None = None
36
37
 
@@ -486,30 +486,36 @@ def validate_meta_extractor_fields(
486
486
  response_body = spec.captured_response.body
487
487
 
488
488
  # Validate each meta extractor field
489
- for field_name, jsonpath_expr in endpoint.meta_extractor.items():
489
+ for field_name, extractor_expr in endpoint.meta_extractor.items():
490
+ # Skip header-based extractors - they extract from headers, not response body
491
+ # @link.next extracts from RFC 5988 Link header
492
+ # @header.X-Name extracts raw header value
493
+ if extractor_expr.startswith("@link.") or extractor_expr.startswith("@header."):
494
+ continue
495
+
490
496
  # Check 1: Does the JSONPath find data in the actual response?
491
497
  try:
492
- parsed_expr = parse_jsonpath(jsonpath_expr)
498
+ parsed_expr = parse_jsonpath(extractor_expr)
493
499
  matches = [match.value for match in parsed_expr.find(response_body)]
494
500
 
495
501
  if not matches:
496
502
  warnings.append(
497
503
  f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' "
498
- f"with JSONPath '{jsonpath_expr}' found no matches in cassette response"
504
+ f"with JSONPath '{extractor_expr}' found no matches in cassette response"
499
505
  )
500
506
  except Exception as e:
501
507
  warnings.append(
502
- f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' has invalid JSONPath '{jsonpath_expr}': {str(e)}"
508
+ f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' has invalid JSONPath '{extractor_expr}': {str(e)}"
503
509
  )
504
510
 
505
511
  # Check 2: Is this field path declared in the response schema?
506
512
  if endpoint.response_schema:
507
- field_in_schema = _check_field_in_schema(jsonpath_expr, endpoint.response_schema)
513
+ field_in_schema = _check_field_in_schema(extractor_expr, endpoint.response_schema)
508
514
 
509
515
  if not field_in_schema:
510
516
  warnings.append(
511
517
  f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' "
512
- f"extracts from '{jsonpath_expr}' but this path is not declared in response schema"
518
+ f"extracts from '{extractor_expr}' but this path is not declared in response schema"
513
519
  )
514
520
 
515
521
  except Exception as e:
@@ -25,6 +25,21 @@ class MailchimpAuthConfig(BaseModel):
25
25
 
26
26
  # ===== RESPONSE TYPE DEFINITIONS (PYDANTIC) =====
27
27
 
28
+ class CampaignDeliveryStatus(BaseModel):
29
+ """Updates on campaigns in the process of sending"""
30
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
31
+
32
+ enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
33
+ """Whether Campaign Delivery Status is enabled for this account and target campaign"""
34
+ can_cancel: Union[bool | None, Any] = Field(default=None, description="Whether a campaign send can be canceled")
35
+ """Whether a campaign send can be canceled"""
36
+ status: Union[str | None, Any] = Field(default=None, description="The current state of a campaign delivery")
37
+ """The current state of a campaign delivery"""
38
+ emails_sent: Union[int | None, Any] = Field(default=None, description="The total number of emails confirmed sent for this campaign so far")
39
+ """The total number of emails confirmed sent for this campaign so far"""
40
+ emails_canceled: Union[int | None, Any] = Field(default=None, description="The total number of emails canceled for this campaign")
41
+ """The total number of emails canceled for this campaign"""
42
+
28
43
  class CampaignRecipients(BaseModel):
29
44
  """List settings for the campaign"""
30
45
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -40,25 +55,6 @@ class CampaignRecipients(BaseModel):
40
55
  recipient_count: Union[int | None, Any] = Field(default=None, description="Count of the recipients on the associated list")
41
56
  """Count of the recipients on the associated list"""
42
57
 
43
- class CampaignTracking(BaseModel):
44
- """The tracking options for a campaign"""
45
- model_config = ConfigDict(extra="allow", populate_by_name=True)
46
-
47
- opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
48
- """Whether to track opens"""
49
- html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version of the campaign")
50
- """Whether to track clicks in the HTML version of the campaign"""
51
- text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version of the campaign")
52
- """Whether to track clicks in the plain-text version of the campaign"""
53
- goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
54
- """Whether to enable Goal tracking"""
55
- ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
56
- """Whether to enable eCommerce360 tracking"""
57
- google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
58
- """The custom slug for Google Analytics tracking"""
59
- clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
60
- """The custom slug for ClickTale tracking"""
61
-
62
58
  class CampaignSettings(BaseModel):
63
59
  """The settings for your campaign"""
64
60
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -96,21 +92,6 @@ class CampaignSettings(BaseModel):
96
92
  drag_and_drop: Union[bool | None, Any] = Field(default=None, description="Whether the campaign uses the drag-and-drop editor")
97
93
  """Whether the campaign uses the drag-and-drop editor"""
98
94
 
99
- class CampaignDeliveryStatus(BaseModel):
100
- """Updates on campaigns in the process of sending"""
101
- model_config = ConfigDict(extra="allow", populate_by_name=True)
102
-
103
- enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
104
- """Whether Campaign Delivery Status is enabled for this account and target campaign"""
105
- can_cancel: Union[bool | None, Any] = Field(default=None, description="Whether a campaign send can be canceled")
106
- """Whether a campaign send can be canceled"""
107
- status: Union[str | None, Any] = Field(default=None, description="The current state of a campaign delivery")
108
- """The current state of a campaign delivery"""
109
- emails_sent: Union[int | None, Any] = Field(default=None, description="The total number of emails confirmed sent for this campaign so far")
110
- """The total number of emails confirmed sent for this campaign so far"""
111
- emails_canceled: Union[int | None, Any] = Field(default=None, description="The total number of emails canceled for this campaign")
112
- """The total number of emails canceled for this campaign"""
113
-
114
95
  class CampaignReportSummaryEcommerce(BaseModel):
115
96
  """E-Commerce stats for a campaign"""
116
97
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -141,6 +122,25 @@ class CampaignReportSummary(BaseModel):
141
122
  ecommerce: Union[CampaignReportSummaryEcommerce | None, Any] = Field(default=None, description="E-Commerce stats for a campaign")
142
123
  """E-Commerce stats for a campaign"""
143
124
 
125
+ class CampaignTracking(BaseModel):
126
+ """The tracking options for a campaign"""
127
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
128
+
129
+ opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
130
+ """Whether to track opens"""
131
+ html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version of the campaign")
132
+ """Whether to track clicks in the HTML version of the campaign"""
133
+ text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version of the campaign")
134
+ """Whether to track clicks in the plain-text version of the campaign"""
135
+ goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
136
+ """Whether to enable Goal tracking"""
137
+ ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
138
+ """Whether to enable eCommerce360 tracking"""
139
+ google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
140
+ """The custom slug for Google Analytics tracking"""
141
+ clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
142
+ """The custom slug for ClickTale tracking"""
143
+
144
144
  class Campaign(BaseModel):
145
145
  """A summary of an individual campaign's settings and content"""
146
146
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -171,40 +171,6 @@ class CampaignsList(BaseModel):
171
171
  campaigns: Union[list[Campaign], Any] = Field(default=None)
172
172
  total_items: Union[int, Any] = Field(default=None)
173
173
 
174
- class ListCampaignDefaults(BaseModel):
175
- """Default values for campaigns created for this list"""
176
- model_config = ConfigDict(extra="allow", populate_by_name=True)
177
-
178
- from_name: Union[str | None, Any] = Field(default=None, description="The default from name for campaigns sent to this list")
179
- """The default from name for campaigns sent to this list"""
180
- from_email: Union[str | None, Any] = Field(default=None, description="The default from email for campaigns sent to this list")
181
- """The default from email for campaigns sent to this list"""
182
- subject: Union[str | None, Any] = Field(default=None, description="The default subject line for campaigns sent to this list")
183
- """The default subject line for campaigns sent to this list"""
184
- language: Union[str | None, Any] = Field(default=None, description="The default language for this list's forms")
185
- """The default language for this list's forms"""
186
-
187
- class ListContact(BaseModel):
188
- """Contact information displayed in campaign footers to comply with international spam laws"""
189
- model_config = ConfigDict(extra="allow", populate_by_name=True)
190
-
191
- company: Union[str | None, Any] = Field(default=None, description="The company name for the list")
192
- """The company name for the list"""
193
- address1: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
194
- """The street address for the list contact"""
195
- address2: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
196
- """The street address for the list contact"""
197
- city: Union[str | None, Any] = Field(default=None, description="The city for the list contact")
198
- """The city for the list contact"""
199
- state: Union[str | None, Any] = Field(default=None, description="The state for the list contact")
200
- """The state for the list contact"""
201
- zip: Union[str | None, Any] = Field(default=None, description="The postal or zip code for the list contact")
202
- """The postal or zip code for the list contact"""
203
- country: Union[str | None, Any] = Field(default=None, description="A two-character ISO3166 country code")
204
- """A two-character ISO3166 country code"""
205
- phone: Union[str | None, Any] = Field(default=None, description="The phone number for the list contact")
206
- """The phone number for the list contact"""
207
-
208
174
  class ListStats(BaseModel):
209
175
  """Stats for the list"""
210
176
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -244,6 +210,40 @@ class ListStats(BaseModel):
244
210
  last_unsub_date: Union[str | None, Any] = Field(default=None, description="The date and time of the last time someone unsubscribed from this list")
245
211
  """The date and time of the last time someone unsubscribed from this list"""
246
212
 
213
+ class ListCampaignDefaults(BaseModel):
214
+ """Default values for campaigns created for this list"""
215
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
216
+
217
+ from_name: Union[str | None, Any] = Field(default=None, description="The default from name for campaigns sent to this list")
218
+ """The default from name for campaigns sent to this list"""
219
+ from_email: Union[str | None, Any] = Field(default=None, description="The default from email for campaigns sent to this list")
220
+ """The default from email for campaigns sent to this list"""
221
+ subject: Union[str | None, Any] = Field(default=None, description="The default subject line for campaigns sent to this list")
222
+ """The default subject line for campaigns sent to this list"""
223
+ language: Union[str | None, Any] = Field(default=None, description="The default language for this list's forms")
224
+ """The default language for this list's forms"""
225
+
226
+ class ListContact(BaseModel):
227
+ """Contact information displayed in campaign footers to comply with international spam laws"""
228
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
229
+
230
+ company: Union[str | None, Any] = Field(default=None, description="The company name for the list")
231
+ """The company name for the list"""
232
+ address1: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
233
+ """The street address for the list contact"""
234
+ address2: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
235
+ """The street address for the list contact"""
236
+ city: Union[str | None, Any] = Field(default=None, description="The city for the list contact")
237
+ """The city for the list contact"""
238
+ state: Union[str | None, Any] = Field(default=None, description="The state for the list contact")
239
+ """The state for the list contact"""
240
+ zip: Union[str | None, Any] = Field(default=None, description="The postal or zip code for the list contact")
241
+ """The postal or zip code for the list contact"""
242
+ country: Union[str | None, Any] = Field(default=None, description="A two-character ISO3166 country code")
243
+ """A two-character ISO3166 country code"""
244
+ phone: Union[str | None, Any] = Field(default=None, description="The phone number for the list contact")
245
+ """The phone number for the list contact"""
246
+
247
247
  class List(BaseModel):
248
248
  """Information about a specific list"""
249
249
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -298,6 +298,15 @@ class ListMemberStats(BaseModel):
298
298
  ecommerce_data: Union[ListMemberStatsEcommerceData | None, Any] = Field(default=None, description="Ecommerce stats for the list member if the list is attached to a store")
299
299
  """Ecommerce stats for the list member if the list is attached to a store"""
300
300
 
301
+ class ListMemberTagsItem(BaseModel):
302
+ """Nested schema for ListMember.tags_item"""
303
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
304
+
305
+ id: Union[int | None, Any] = Field(default=None, description="The tag id")
306
+ """The tag id"""
307
+ name: Union[str | None, Any] = Field(default=None, description="The name of the tag")
308
+ """The name of the tag"""
309
+
301
310
  class ListMemberLocation(BaseModel):
302
311
  """Subscriber location information"""
303
312
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -317,15 +326,6 @@ class ListMemberLocation(BaseModel):
317
326
  region: Union[str | None, Any] = Field(default=None, description="The region for the location")
318
327
  """The region for the location"""
319
328
 
320
- class ListMemberTagsItem(BaseModel):
321
- """Nested schema for ListMember.tags_item"""
322
- model_config = ConfigDict(extra="allow", populate_by_name=True)
323
-
324
- id: Union[int | None, Any] = Field(default=None, description="The tag id")
325
- """The tag id"""
326
- name: Union[str | None, Any] = Field(default=None, description="The name of the tag")
327
- """The name of the tag"""
328
-
329
329
  class ListMember(BaseModel):
330
330
  """Individuals who are currently or have been previously subscribed to this list"""
331
331
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -366,40 +366,49 @@ class ListMembersList(BaseModel):
366
366
  list_id: Union[str | None, Any] = Field(default=None)
367
367
  total_items: Union[int, Any] = Field(default=None)
368
368
 
369
- class ReportListStats(BaseModel):
370
- """The average campaign statistics for your list"""
369
+ class ReportOpens(BaseModel):
370
+ """An object describing the open activity for the campaign"""
371
371
  model_config = ConfigDict(extra="allow", populate_by_name=True)
372
372
 
373
- sub_rate: Union[float | None, Any] = Field(default=None, description="The average number of subscriptions per month for the list")
374
- """The average number of subscriptions per month for the list"""
375
- unsub_rate: Union[float | None, Any] = Field(default=None, description="The average number of unsubscriptions per month for the list")
376
- """The average number of unsubscriptions per month for the list"""
377
- open_rate: Union[float | None, Any] = Field(default=None, description="The average open rate for campaigns sent to this list")
378
- """The average open rate for campaigns sent to this list"""
379
- click_rate: Union[float | None, Any] = Field(default=None, description="The average click rate for campaigns sent to this list")
380
- """The average click rate for campaigns sent to this list"""
373
+ opens_total: Union[int | None, Any] = Field(default=None, description="The total number of opens for a campaign")
374
+ """The total number of opens for a campaign"""
375
+ unique_opens: Union[int | None, Any] = Field(default=None, description="The total number of unique opens")
376
+ """The total number of unique opens"""
377
+ open_rate: Union[float | None, Any] = Field(default=None, description="The number of unique opens divided by the total number of successful deliveries")
378
+ """The number of unique opens divided by the total number of successful deliveries"""
379
+ last_open: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded open")
380
+ """The date and time of the last recorded open"""
381
381
 
382
- class ReportEcommerce(BaseModel):
383
- """E-Commerce stats for a campaign"""
382
+ class ReportForwards(BaseModel):
383
+ """An object describing the forwards and forward activity for the campaign"""
384
384
  model_config = ConfigDict(extra="allow", populate_by_name=True)
385
385
 
386
- total_orders: Union[int | None, Any] = Field(default=None, description="The total orders for a campaign")
387
- """The total orders for a campaign"""
388
- total_spent: Union[float | None, Any] = Field(default=None, description="The total spent for a campaign")
389
- """The total spent for a campaign"""
390
- total_revenue: Union[float | None, Any] = Field(default=None, description="The total revenue for a campaign")
391
- """The total revenue for a campaign"""
386
+ forwards_count: Union[int | None, Any] = Field(default=None, description="How many times the campaign has been forwarded")
387
+ """How many times the campaign has been forwarded"""
388
+ forwards_opens: Union[int | None, Any] = Field(default=None, description="How many times the forwarded campaign has been opened")
389
+ """How many times the forwarded campaign has been opened"""
392
390
 
393
- class ReportFacebookLikes(BaseModel):
394
- """An object describing campaign engagement on Facebook"""
391
+ class ReportClicks(BaseModel):
392
+ """An object describing the click activity for the campaign"""
395
393
  model_config = ConfigDict(extra="allow", populate_by_name=True)
396
394
 
397
- recipient_likes: Union[int | None, Any] = Field(default=None, description="The number of recipients who liked the campaign on Facebook")
398
- """The number of recipients who liked the campaign on Facebook"""
399
- unique_likes: Union[int | None, Any] = Field(default=None, description="The number of unique likes")
400
- """The number of unique likes"""
401
- facebook_likes: Union[int | None, Any] = Field(default=None, description="The number of Facebook likes for the campaign")
402
- """The number of Facebook likes for the campaign"""
395
+ clicks_total: Union[int | None, Any] = Field(default=None, description="The total number of clicks for the campaign")
396
+ """The total number of clicks for the campaign"""
397
+ unique_clicks: Union[int | None, Any] = Field(default=None, description="The total number of unique clicks for links across a campaign")
398
+ """The total number of unique clicks for links across a campaign"""
399
+ unique_subscriber_clicks: Union[int | None, Any] = Field(default=None, description="The total number of subscribers who clicked on a campaign")
400
+ """The total number of subscribers who clicked on a campaign"""
401
+ click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
402
+ """The number of unique clicks divided by the total number of successful deliveries"""
403
+ last_click: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded click for the campaign")
404
+ """The date and time of the last recorded click for the campaign"""
405
+
406
+ class ReportDeliveryStatus(BaseModel):
407
+ """Updates on campaigns in the process of sending"""
408
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
409
+
410
+ enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
411
+ """Whether Campaign Delivery Status is enabled for this account and target campaign"""
403
412
 
404
413
  class ReportIndustryStats(BaseModel):
405
414
  """The average campaign statistics for your industry"""
@@ -420,18 +429,40 @@ class ReportIndustryStats(BaseModel):
420
429
  abuse_rate: Union[float | None, Any] = Field(default=None, description="The industry abuse rate")
421
430
  """The industry abuse rate"""
422
431
 
423
- class ReportOpens(BaseModel):
424
- """An object describing the open activity for the campaign"""
432
+ class ReportFacebookLikes(BaseModel):
433
+ """An object describing campaign engagement on Facebook"""
425
434
  model_config = ConfigDict(extra="allow", populate_by_name=True)
426
435
 
427
- opens_total: Union[int | None, Any] = Field(default=None, description="The total number of opens for a campaign")
428
- """The total number of opens for a campaign"""
429
- unique_opens: Union[int | None, Any] = Field(default=None, description="The total number of unique opens")
430
- """The total number of unique opens"""
431
- open_rate: Union[float | None, Any] = Field(default=None, description="The number of unique opens divided by the total number of successful deliveries")
432
- """The number of unique opens divided by the total number of successful deliveries"""
433
- last_open: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded open")
434
- """The date and time of the last recorded open"""
436
+ recipient_likes: Union[int | None, Any] = Field(default=None, description="The number of recipients who liked the campaign on Facebook")
437
+ """The number of recipients who liked the campaign on Facebook"""
438
+ unique_likes: Union[int | None, Any] = Field(default=None, description="The number of unique likes")
439
+ """The number of unique likes"""
440
+ facebook_likes: Union[int | None, Any] = Field(default=None, description="The number of Facebook likes for the campaign")
441
+ """The number of Facebook likes for the campaign"""
442
+
443
+ class ReportEcommerce(BaseModel):
444
+ """E-Commerce stats for a campaign"""
445
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
446
+
447
+ total_orders: Union[int | None, Any] = Field(default=None, description="The total orders for a campaign")
448
+ """The total orders for a campaign"""
449
+ total_spent: Union[float | None, Any] = Field(default=None, description="The total spent for a campaign")
450
+ """The total spent for a campaign"""
451
+ total_revenue: Union[float | None, Any] = Field(default=None, description="The total revenue for a campaign")
452
+ """The total revenue for a campaign"""
453
+
454
+ class ReportListStats(BaseModel):
455
+ """The average campaign statistics for your list"""
456
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
457
+
458
+ sub_rate: Union[float | None, Any] = Field(default=None, description="The average number of subscriptions per month for the list")
459
+ """The average number of subscriptions per month for the list"""
460
+ unsub_rate: Union[float | None, Any] = Field(default=None, description="The average number of unsubscriptions per month for the list")
461
+ """The average number of unsubscriptions per month for the list"""
462
+ open_rate: Union[float | None, Any] = Field(default=None, description="The average open rate for campaigns sent to this list")
463
+ """The average open rate for campaigns sent to this list"""
464
+ click_rate: Union[float | None, Any] = Field(default=None, description="The average click rate for campaigns sent to this list")
465
+ """The average click rate for campaigns sent to this list"""
435
466
 
436
467
  class ReportBounces(BaseModel):
437
468
  """An object describing the bounce summary for the campaign"""
@@ -444,37 +475,6 @@ class ReportBounces(BaseModel):
444
475
  syntax_errors: Union[int | None, Any] = Field(default=None, description="The total number of addresses that were syntax-related bounces")
445
476
  """The total number of addresses that were syntax-related bounces"""
446
477
 
447
- class ReportDeliveryStatus(BaseModel):
448
- """Updates on campaigns in the process of sending"""
449
- model_config = ConfigDict(extra="allow", populate_by_name=True)
450
-
451
- enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
452
- """Whether Campaign Delivery Status is enabled for this account and target campaign"""
453
-
454
- class ReportForwards(BaseModel):
455
- """An object describing the forwards and forward activity for the campaign"""
456
- model_config = ConfigDict(extra="allow", populate_by_name=True)
457
-
458
- forwards_count: Union[int | None, Any] = Field(default=None, description="How many times the campaign has been forwarded")
459
- """How many times the campaign has been forwarded"""
460
- forwards_opens: Union[int | None, Any] = Field(default=None, description="How many times the forwarded campaign has been opened")
461
- """How many times the forwarded campaign has been opened"""
462
-
463
- class ReportClicks(BaseModel):
464
- """An object describing the click activity for the campaign"""
465
- model_config = ConfigDict(extra="allow", populate_by_name=True)
466
-
467
- clicks_total: Union[int | None, Any] = Field(default=None, description="The total number of clicks for the campaign")
468
- """The total number of clicks for the campaign"""
469
- unique_clicks: Union[int | None, Any] = Field(default=None, description="The total number of unique clicks for links across a campaign")
470
- """The total number of unique clicks for links across a campaign"""
471
- unique_subscriber_clicks: Union[int | None, Any] = Field(default=None, description="The total number of subscribers who clicked on a campaign")
472
- """The total number of subscribers who clicked on a campaign"""
473
- click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
474
- """The number of unique clicks divided by the total number of successful deliveries"""
475
- last_click: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded click for the campaign")
476
- """The date and time of the last recorded click for the campaign"""
477
-
478
478
  class Report(BaseModel):
479
479
  """Report details about a sent campaign"""
480
480
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -560,24 +560,26 @@ class AutomationReportSummary(BaseModel):
560
560
  click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
561
561
  """The number of unique clicks divided by the total number of successful deliveries"""
562
562
 
563
- class AutomationTracking(BaseModel):
564
- """The tracking options for the Automation"""
563
+ class AutomationSettings(BaseModel):
564
+ """The settings for the Automation workflow"""
565
565
  model_config = ConfigDict(extra="allow", populate_by_name=True)
566
566
 
567
- opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
568
- """Whether to track opens"""
569
- html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version")
570
- """Whether to track clicks in the HTML version"""
571
- text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version")
572
- """Whether to track clicks in the plain-text version"""
573
- goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
574
- """Whether to enable Goal tracking"""
575
- ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
576
- """Whether to enable eCommerce360 tracking"""
577
- google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
578
- """The custom slug for Google Analytics tracking"""
579
- clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
580
- """The custom slug for ClickTale tracking"""
567
+ title: Union[str | None, Any] = Field(default=None, description="The title of the Automation")
568
+ """The title of the Automation"""
569
+ from_name: Union[str | None, Any] = Field(default=None, description="The from name for the Automation")
570
+ """The from name for the Automation"""
571
+ reply_to: Union[str | None, Any] = Field(default=None, description="The reply-to email address for the Automation")
572
+ """The reply-to email address for the Automation"""
573
+ use_conversation: Union[bool | None, Any] = Field(default=None, description="Whether to use Mailchimp Conversation feature")
574
+ """Whether to use Mailchimp Conversation feature"""
575
+ to_name: Union[str | None, Any] = Field(default=None, description="The Automation's custom to name")
576
+ """The Automation's custom to name"""
577
+ authenticate: Union[bool | None, Any] = Field(default=None, description="Whether Mailchimp authenticated the Automation")
578
+ """Whether Mailchimp authenticated the Automation"""
579
+ auto_footer: Union[bool | None, Any] = Field(default=None, description="Whether to automatically append Mailchimp's default footer")
580
+ """Whether to automatically append Mailchimp's default footer"""
581
+ inline_css: Union[bool | None, Any] = Field(default=None, description="Whether to automatically inline the CSS")
582
+ """Whether to automatically inline the CSS"""
581
583
 
582
584
  class AutomationRecipientsSegmentOpts(BaseModel):
583
585
  """An object representing all segmentation options"""
@@ -605,26 +607,24 @@ class AutomationRecipients(BaseModel):
605
607
  store_id: Union[str | None, Any] = Field(default=None, description="The id of the store")
606
608
  """The id of the store"""
607
609
 
608
- class AutomationSettings(BaseModel):
609
- """The settings for the Automation workflow"""
610
+ class AutomationTracking(BaseModel):
611
+ """The tracking options for the Automation"""
610
612
  model_config = ConfigDict(extra="allow", populate_by_name=True)
611
613
 
612
- title: Union[str | None, Any] = Field(default=None, description="The title of the Automation")
613
- """The title of the Automation"""
614
- from_name: Union[str | None, Any] = Field(default=None, description="The from name for the Automation")
615
- """The from name for the Automation"""
616
- reply_to: Union[str | None, Any] = Field(default=None, description="The reply-to email address for the Automation")
617
- """The reply-to email address for the Automation"""
618
- use_conversation: Union[bool | None, Any] = Field(default=None, description="Whether to use Mailchimp Conversation feature")
619
- """Whether to use Mailchimp Conversation feature"""
620
- to_name: Union[str | None, Any] = Field(default=None, description="The Automation's custom to name")
621
- """The Automation's custom to name"""
622
- authenticate: Union[bool | None, Any] = Field(default=None, description="Whether Mailchimp authenticated the Automation")
623
- """Whether Mailchimp authenticated the Automation"""
624
- auto_footer: Union[bool | None, Any] = Field(default=None, description="Whether to automatically append Mailchimp's default footer")
625
- """Whether to automatically append Mailchimp's default footer"""
626
- inline_css: Union[bool | None, Any] = Field(default=None, description="Whether to automatically inline the CSS")
627
- """Whether to automatically inline the CSS"""
614
+ opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
615
+ """Whether to track opens"""
616
+ html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version")
617
+ """Whether to track clicks in the HTML version"""
618
+ text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version")
619
+ """Whether to track clicks in the plain-text version"""
620
+ goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
621
+ """Whether to enable Goal tracking"""
622
+ ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
623
+ """Whether to enable eCommerce360 tracking"""
624
+ google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
625
+ """The custom slug for Google Analytics tracking"""
626
+ clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
627
+ """The custom slug for ClickTale tracking"""
628
628
 
629
629
  class Automation(BaseModel):
630
630
  """A summary of an individual Automation workflow's settings and content"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-mailchimp
3
- Version: 0.1.4
3
+ Version: 0.1.7
4
4
  Summary: Airbyte Mailchimp 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/
@@ -114,6 +114,6 @@ For the service's official API docs, see the [Mailchimp API reference](https://m
114
114
 
115
115
  ## Version information
116
116
 
117
- - **Package version:** 0.1.4
117
+ - **Package version:** 0.1.7
118
118
  - **Connector version:** 1.0.1
119
- - **Generated with Connector SDK commit SHA:** ca5acdda8030d8292c059c82f498a95b2227c106
119
+ - **Generated with Connector SDK commit SHA:** c46670b9e4ca5238c0372e143b44088a0d1a68ee
@@ -1,7 +1,7 @@
1
- airbyte_agent_mailchimp/__init__.py,sha256=dvjp5b2a54YTMalVb-VddYhP9M1NPWit5JTEl4mcEhA,5275
1
+ airbyte_agent_mailchimp/__init__.py,sha256=yafBcpb8eP266D-XBj05UdokNYrzQ9DV-PokBx7Hf5c,5275
2
2
  airbyte_agent_mailchimp/connector.py,sha256=gUki4sLvMzmHCCLIhbMZx-DJH7xO6jXM5yipWZaFQyM,45867
3
3
  airbyte_agent_mailchimp/connector_model.py,sha256=LTOadOFSXgfDn7kqZrFlOymAzhOpDq2V7tKopmHFPPQ,281492
4
- airbyte_agent_mailchimp/models.py,sha256=nQPeQwromlL3mHFR1rmiVBZCo4Pu1PRbHObUjNq8Y4A,56168
4
+ airbyte_agent_mailchimp/models.py,sha256=67JYvyMZd7QEl1qEbym4tE6gnYE2FehX_El6tvIZFd8,56168
5
5
  airbyte_agent_mailchimp/types.py,sha256=9OeRLHJdQY3F4Y5gS5tn6lcF-Vfx45CIheTUH3hAZbA,4881
6
6
  airbyte_agent_mailchimp/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
7
7
  airbyte_agent_mailchimp/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
@@ -11,17 +11,17 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/connector_model_loader.py,sha256
11
11
  airbyte_agent_mailchimp/_vendored/connector_sdk/constants.py,sha256=AtzOvhDMWbRJgpsQNWl5tkogHD6mWgEY668PgRmgtOY,2737
12
12
  airbyte_agent_mailchimp/_vendored/connector_sdk/exceptions.py,sha256=ss5MGv9eVPmsbLcLWetuu3sDmvturwfo6Pw3M37Oq5k,481
13
13
  airbyte_agent_mailchimp/_vendored/connector_sdk/extensions.py,sha256=XWRRoJOOrwUHSKbuQt5DU7CCu8ePzhd_HuP7c_uD77w,21376
14
- airbyte_agent_mailchimp/_vendored/connector_sdk/http_client.py,sha256=NdccrrBHI5rW56XnXcP54arCwywIVKnMeSQPas6KlOM,27466
14
+ airbyte_agent_mailchimp/_vendored/connector_sdk/http_client.py,sha256=yucwu3OvJh5wLQa1mk-gTKjtqjKKucMw5ltmlE7mk1c,28000
15
15
  airbyte_agent_mailchimp/_vendored/connector_sdk/introspection.py,sha256=2CyKXZHT74-1Id97uw1RLeyOi6TV24_hoNbQ6-6y7uI,10335
16
16
  airbyte_agent_mailchimp/_vendored/connector_sdk/secrets.py,sha256=J9ezMu4xNnLW11xY5RCre6DHP7YMKZCqwGJfk7ufHAM,6855
17
17
  airbyte_agent_mailchimp/_vendored/connector_sdk/types.py,sha256=CStkOsLtmZZdXylkdCsbYORDzughxygt1-Ucma0j-qE,8287
18
18
  airbyte_agent_mailchimp/_vendored/connector_sdk/utils.py,sha256=G4LUXOC2HzPoND2v4tQW68R9uuPX9NQyCjaGxb7Kpl0,1958
19
- airbyte_agent_mailchimp/_vendored/connector_sdk/validation.py,sha256=CDjCux1eg35a0Y4BegSivzIwZjiTqOxYWotWNLqTSVU,31792
19
+ airbyte_agent_mailchimp/_vendored/connector_sdk/validation.py,sha256=4MPrxYmQh8TbCU0KdvvRKe35Lg1YYLEBd0u4aKySl_E,32122
20
20
  airbyte_agent_mailchimp/_vendored/connector_sdk/cloud_utils/__init__.py,sha256=4799Hv9f2zxDVj1aLyQ8JpTEuFTp_oOZMRz-NZCdBJg,134
21
21
  airbyte_agent_mailchimp/_vendored/connector_sdk/cloud_utils/client.py,sha256=YxdRpQr9XjDzih6csSseBVGn9kfMtaqbOCXP0TPuzFY,7189
22
22
  airbyte_agent_mailchimp/_vendored/connector_sdk/executor/__init__.py,sha256=EmG9YQNAjSuYCVB4D5VoLm4qpD1KfeiiOf7bpALj8p8,702
23
23
  airbyte_agent_mailchimp/_vendored/connector_sdk/executor/hosted_executor.py,sha256=ydHcG-biRS1ITT5ELwPShdJW-KYpvK--Fos1ipNgHho,6995
24
- airbyte_agent_mailchimp/_vendored/connector_sdk/executor/local_executor.py,sha256=qbvarouUD61Dqg6v3hiWnK9scf3At3CvtZzcYcUcT0M,68024
24
+ airbyte_agent_mailchimp/_vendored/connector_sdk/executor/local_executor.py,sha256=oJDliuS7zU8GILJUjn7T_WNIu25sy5serJHxhnBKyB8,71411
25
25
  airbyte_agent_mailchimp/_vendored/connector_sdk/executor/models.py,sha256=lYVT_bNcw-PoIks4WHNyl2VY-lJVf2FntzINSOBIheE,5845
26
26
  airbyte_agent_mailchimp/_vendored/connector_sdk/http/__init__.py,sha256=y8fbzZn-3yV9OxtYz8Dy6FFGI5v6TOqADd1G3xHH3Hw,911
27
27
  airbyte_agent_mailchimp/_vendored/connector_sdk/http/config.py,sha256=6J7YIIwHC6sRu9i-yKa5XvArwK2KU60rlnmxzDZq3lw,3283
@@ -31,8 +31,8 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/http/response.py,sha256=Q-RyM5D0
31
31
  airbyte_agent_mailchimp/_vendored/connector_sdk/http/adapters/__init__.py,sha256=gjbWdU4LfzUG2PETI0TkfkukdzoCAhpL6FZtIEnkO-s,209
32
32
  airbyte_agent_mailchimp/_vendored/connector_sdk/http/adapters/httpx_adapter.py,sha256=dkYhzBWiKBmzWZlc-cRTx50Hb6fy3OI8kOQvXRfS1CQ,8465
33
33
  airbyte_agent_mailchimp/_vendored/connector_sdk/logging/__init__.py,sha256=IZoE5yXhwSA0m3xQqh0FiCifjp1sB3S8jnnFPuJLYf8,227
34
- airbyte_agent_mailchimp/_vendored/connector_sdk/logging/logger.py,sha256=GKm03UgDMNlvGuuH_c07jNcZmUccC3DISG269Ehj1Uo,8084
35
- airbyte_agent_mailchimp/_vendored/connector_sdk/logging/types.py,sha256=z0UiSdXP_r71mtwWkJydo0InsNpYOMyI7SVutzd2PEo,3172
34
+ airbyte_agent_mailchimp/_vendored/connector_sdk/logging/logger.py,sha256=rUdKDEQe3pOODmBLEcvhgZeEZi48BvrgKXKq1xvCXu0,8387
35
+ airbyte_agent_mailchimp/_vendored/connector_sdk/logging/types.py,sha256=ONb9xKNXUkrR2lojSBMF7ruof7S2r92WjrO_kEZic84,3239
36
36
  airbyte_agent_mailchimp/_vendored/connector_sdk/observability/__init__.py,sha256=ojx1n9vaWCXFFvb3-90Pwtg845trFdV2v6wcCoO75Ko,269
37
37
  airbyte_agent_mailchimp/_vendored/connector_sdk/observability/config.py,sha256=uWvRAPHnEusVKviQQncqcpnHKNhoZ4ZoFK6nUOSVClY,5372
38
38
  airbyte_agent_mailchimp/_vendored/connector_sdk/observability/models.py,sha256=IRGjlJia28_IU7BMSBb5RHWs47yAOLvE20JIIXHazLY,448
@@ -52,6 +52,6 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaL
52
52
  airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
53
53
  airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/events.py,sha256=8Y1NbXiwISX-V_wRofY7PqcwEXD0dLMnntKkY6XFU2s,1328
54
54
  airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/tracker.py,sha256=Ftrk0_ddfM7dZG8hF9xBuPwhbc9D6JZ7Q9qs5o3LEyA,5579
55
- airbyte_agent_mailchimp-0.1.4.dist-info/METADATA,sha256=k1kTt58LCy0cND36IU2aB-6DIulKE-kqxjvcVU6dn1M,4592
56
- airbyte_agent_mailchimp-0.1.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
57
- airbyte_agent_mailchimp-0.1.4.dist-info/RECORD,,
55
+ airbyte_agent_mailchimp-0.1.7.dist-info/METADATA,sha256=gXO0B8sR7ptnZ4UAUDj2UVxDVMYx21B662a9eTojbP8,4592
56
+ airbyte_agent_mailchimp-0.1.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
57
+ airbyte_agent_mailchimp-0.1.7.dist-info/RECORD,,