@zernio/node 0.2.1168 → 0.2.1169

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.
package/dist/index.d.mts CHANGED
@@ -2139,11 +2139,11 @@ type Ad = {
2139
2139
  amount?: number;
2140
2140
  type?: 'daily' | 'lifetime';
2141
2141
  /**
2142
- * LinkedIn only. The parent campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2142
+ * LinkedIn and X only. The daily budget (LinkedIn: the parent campaign's `dailyBudget`; X: the line item's, or the campaign's when the line item has none). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2143
2143
  */
2144
2144
  daily?: number;
2145
2145
  /**
2146
- * LinkedIn only. The parent campaign's `totalBudget`, readable even when a daily budget is also set.
2146
+ * LinkedIn and X only. The lifetime total (LinkedIn: the parent campaign's `totalBudget`; X: `total_budget_amount_local_micro`, for example the `lifetimeBudgetCap` of a boost), readable even when a daily budget is also set.
2147
2147
  */
2148
2148
  lifetime?: number;
2149
2149
  /**
@@ -3373,11 +3373,11 @@ type AdTreeAdSet = {
3373
3373
  amount?: number;
3374
3374
  type?: 'daily' | 'lifetime';
3375
3375
  /**
3376
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3376
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3377
3377
  */
3378
3378
  daily?: number;
3379
3379
  /**
3380
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
3380
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
3381
3381
  */
3382
3382
  lifetime?: number;
3383
3383
  /**
@@ -10696,7 +10696,7 @@ type ParameterCatalogTokenAccountId = string;
10696
10696
  */
10697
10697
  type ParameterIdempotencyKeyHeader = string;
10698
10698
  /**
10699
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
10699
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
10700
10700
  */
10701
10701
  type ParameterLiveStatusRead = boolean;
10702
10702
  /**
@@ -40609,7 +40609,7 @@ type ListAdCampaignsData = {
40609
40609
  includeEmpty?: boolean;
40610
40610
  limit?: number;
40611
40611
  /**
40612
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
40612
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
40613
40613
  */
40614
40614
  live?: boolean;
40615
40615
  /**
@@ -41066,11 +41066,15 @@ type UpdateAdCampaignResponse = ({
41066
41066
  type UpdateAdCampaignError = (unknown | ErrorResponse);
41067
41067
  type DeleteAdCampaignData = {
41068
41068
  body: {
41069
- platform: 'facebook' | 'instagram' | 'google';
41069
+ platform: 'facebook' | 'instagram' | 'google' | 'twitter';
41070
41070
  /**
41071
41071
  * Zernio SocialAccount id owning the ad account. Required only to delete an EMPTY campaign (zero ads), which has no local Ad documents to resolve a token from.
41072
41072
  */
41073
41073
  accountId?: string;
41074
+ /**
41075
+ * X only, for an EMPTY campaign that was never synced: the X ad account id the campaign belongs to (lowercase letters and digits). The synced campaign's ad account wins when there is one. Also accepted on the query string.
41076
+ */
41077
+ adAccountId?: string;
41074
41078
  };
41075
41079
  path: {
41076
41080
  /**
@@ -41502,7 +41506,7 @@ type ListAdSetsData = {
41502
41506
  */
41503
41507
  campaignId?: string;
41504
41508
  /**
41505
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
41509
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
41506
41510
  */
41507
41511
  live?: boolean;
41508
41512
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
@@ -41527,11 +41531,11 @@ type ListAdSetsResponse = ({
41527
41531
  amount?: number;
41528
41532
  type?: 'daily' | 'lifetime';
41529
41533
  /**
41530
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41534
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41531
41535
  */
41532
41536
  daily?: number;
41533
41537
  /**
41534
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
41538
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
41535
41539
  */
41536
41540
  lifetime?: number;
41537
41541
  /**
@@ -41835,11 +41839,11 @@ type UpdateAdSetData = {
41835
41839
  type?: 'daily' | 'lifetime';
41836
41840
  };
41837
41841
  /**
41838
- * Writes the ad set's own on/off switch (Meta: `configured_status`) on Meta and LinkedIn, whatever delivery status its ads report. Omit if not toggling delivery state.
41842
+ * Writes the ad set's own on/off switch (Meta: `configured_status`; X: the line item's `entity_status` ACTIVE / PAUSED), whatever delivery status its ads report. Omit if not toggling delivery state.
41839
41843
  */
41840
41844
  status?: 'active' | 'paused';
41841
41845
  /**
41842
- * Rename the ad set (Meta only; other platforms return 501). At least one of budget/status/bidStrategy/name is required.
41846
+ * Rename the ad set (on X, the line item `name`). Platforms without a rename return 501. At least one of budget/status/bidStrategy/name is required.
41843
41847
  */
41844
41848
  name?: string;
41845
41849
  /**
@@ -41849,8 +41853,13 @@ type UpdateAdSetData = {
41849
41853
  * automatically. On OpenAI, LOWEST_COST_WITH_BID_CAP and COST_CAP both map to
41850
41854
  * the ad group's `bidding_config.max_bid_micros` (one knob covers both);
41851
41855
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422 (OpenAI has no ROAS-based
41852
- * bidding). Other platforms (linkedin, pinterest, google, twitter) return 501
41853
- * Not Implemented when bidStrategy is set.
41856
+ * bidding). On X it writes the line item's `bid_strategy`:
41857
+ * LOWEST_COST_WITHOUT_CAP = AUTO, LOWEST_COST_WITH_BID_CAP = MAX and
41858
+ * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
41859
+ * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
41860
+ * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
41861
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
41862
+ * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
41854
41863
  *
41855
41864
  */
41856
41865
  bidStrategy?: (BidStrategy);
@@ -41877,7 +41886,7 @@ type UpdateAdSetData = {
41877
41886
  /**
41878
41887
  * Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
41879
41888
  * bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP. Internally converted to Meta's
41880
- * smallest-denomination integer, or (on OpenAI) to micros (× 1,000,000). Meta only:
41889
+ * smallest-denomination integer, or (on OpenAI and X) to micros (× 1,000,000). Meta only:
41881
41890
  * may be sent alone, WITHOUT bidStrategy, to update the cap amount on an ad set whose
41882
41891
  * parent campaign is COST_CAP or LOWEST_COST_WITH_BID_CAP (the strategy is inherited
41883
41892
  * from the campaign and is left untouched).
@@ -42193,7 +42202,7 @@ type GetAdData = {
42193
42202
  };
42194
42203
  query?: {
42195
42204
  /**
42196
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
42205
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
42197
42206
  */
42198
42207
  live?: boolean;
42199
42208
  };
@@ -46385,6 +46394,10 @@ type BoostPostData = {
46385
46394
  * Goes together with budgetAmount. lifetime requires schedule.endDate.
46386
46395
  */
46387
46396
  budgetType?: 'daily' | 'lifetime';
46397
+ /**
46398
+ * X only. A lifetime total, in whole currency units, that caps a daily budget (budgetType daily): the line item gets both daily_budget_amount_local_micro and total_budget_amount_local_micro, and stops spending once the total is reached. Must be at least budgetAmount. Read back as budget.daily and budget.lifetime. 400 on a lifetime budget or on another platform.
46399
+ */
46400
+ lifetimeBudgetCap?: number;
46388
46401
  /**
46389
46402
  * Alias of budgetAmount + budgetType, kept for existing callers
46390
46403
  * @deprecated
@@ -46421,7 +46434,7 @@ type BoostPostData = {
46421
46434
  */
46422
46435
  startDate?: string;
46423
46436
  /**
46424
- * Ad-set end time (ISO 8601), mapped to the ad set's `end_time`. Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46437
+ * Ad-set end time (ISO 8601), mapped to the ad set's `end_time` (on X, the line item's `end_time`; X campaigns carry no flight dates). Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46425
46438
  */
46426
46439
  endDate?: string;
46427
46440
  /**
package/dist/index.d.ts CHANGED
@@ -2139,11 +2139,11 @@ type Ad = {
2139
2139
  amount?: number;
2140
2140
  type?: 'daily' | 'lifetime';
2141
2141
  /**
2142
- * LinkedIn only. The parent campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2142
+ * LinkedIn and X only. The daily budget (LinkedIn: the parent campaign's `dailyBudget`; X: the line item's, or the campaign's when the line item has none). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2143
2143
  */
2144
2144
  daily?: number;
2145
2145
  /**
2146
- * LinkedIn only. The parent campaign's `totalBudget`, readable even when a daily budget is also set.
2146
+ * LinkedIn and X only. The lifetime total (LinkedIn: the parent campaign's `totalBudget`; X: `total_budget_amount_local_micro`, for example the `lifetimeBudgetCap` of a boost), readable even when a daily budget is also set.
2147
2147
  */
2148
2148
  lifetime?: number;
2149
2149
  /**
@@ -3373,11 +3373,11 @@ type AdTreeAdSet = {
3373
3373
  amount?: number;
3374
3374
  type?: 'daily' | 'lifetime';
3375
3375
  /**
3376
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3376
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3377
3377
  */
3378
3378
  daily?: number;
3379
3379
  /**
3380
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
3380
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
3381
3381
  */
3382
3382
  lifetime?: number;
3383
3383
  /**
@@ -10696,7 +10696,7 @@ type ParameterCatalogTokenAccountId = string;
10696
10696
  */
10697
10697
  type ParameterIdempotencyKeyHeader = string;
10698
10698
  /**
10699
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
10699
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
10700
10700
  */
10701
10701
  type ParameterLiveStatusRead = boolean;
10702
10702
  /**
@@ -40609,7 +40609,7 @@ type ListAdCampaignsData = {
40609
40609
  includeEmpty?: boolean;
40610
40610
  limit?: number;
40611
40611
  /**
40612
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
40612
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
40613
40613
  */
40614
40614
  live?: boolean;
40615
40615
  /**
@@ -41066,11 +41066,15 @@ type UpdateAdCampaignResponse = ({
41066
41066
  type UpdateAdCampaignError = (unknown | ErrorResponse);
41067
41067
  type DeleteAdCampaignData = {
41068
41068
  body: {
41069
- platform: 'facebook' | 'instagram' | 'google';
41069
+ platform: 'facebook' | 'instagram' | 'google' | 'twitter';
41070
41070
  /**
41071
41071
  * Zernio SocialAccount id owning the ad account. Required only to delete an EMPTY campaign (zero ads), which has no local Ad documents to resolve a token from.
41072
41072
  */
41073
41073
  accountId?: string;
41074
+ /**
41075
+ * X only, for an EMPTY campaign that was never synced: the X ad account id the campaign belongs to (lowercase letters and digits). The synced campaign's ad account wins when there is one. Also accepted on the query string.
41076
+ */
41077
+ adAccountId?: string;
41074
41078
  };
41075
41079
  path: {
41076
41080
  /**
@@ -41502,7 +41506,7 @@ type ListAdSetsData = {
41502
41506
  */
41503
41507
  campaignId?: string;
41504
41508
  /**
41505
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
41509
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
41506
41510
  */
41507
41511
  live?: boolean;
41508
41512
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
@@ -41527,11 +41531,11 @@ type ListAdSetsResponse = ({
41527
41531
  amount?: number;
41528
41532
  type?: 'daily' | 'lifetime';
41529
41533
  /**
41530
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41534
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41531
41535
  */
41532
41536
  daily?: number;
41533
41537
  /**
41534
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
41538
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
41535
41539
  */
41536
41540
  lifetime?: number;
41537
41541
  /**
@@ -41835,11 +41839,11 @@ type UpdateAdSetData = {
41835
41839
  type?: 'daily' | 'lifetime';
41836
41840
  };
41837
41841
  /**
41838
- * Writes the ad set's own on/off switch (Meta: `configured_status`) on Meta and LinkedIn, whatever delivery status its ads report. Omit if not toggling delivery state.
41842
+ * Writes the ad set's own on/off switch (Meta: `configured_status`; X: the line item's `entity_status` ACTIVE / PAUSED), whatever delivery status its ads report. Omit if not toggling delivery state.
41839
41843
  */
41840
41844
  status?: 'active' | 'paused';
41841
41845
  /**
41842
- * Rename the ad set (Meta only; other platforms return 501). At least one of budget/status/bidStrategy/name is required.
41846
+ * Rename the ad set (on X, the line item `name`). Platforms without a rename return 501. At least one of budget/status/bidStrategy/name is required.
41843
41847
  */
41844
41848
  name?: string;
41845
41849
  /**
@@ -41849,8 +41853,13 @@ type UpdateAdSetData = {
41849
41853
  * automatically. On OpenAI, LOWEST_COST_WITH_BID_CAP and COST_CAP both map to
41850
41854
  * the ad group's `bidding_config.max_bid_micros` (one knob covers both);
41851
41855
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422 (OpenAI has no ROAS-based
41852
- * bidding). Other platforms (linkedin, pinterest, google, twitter) return 501
41853
- * Not Implemented when bidStrategy is set.
41856
+ * bidding). On X it writes the line item's `bid_strategy`:
41857
+ * LOWEST_COST_WITHOUT_CAP = AUTO, LOWEST_COST_WITH_BID_CAP = MAX and
41858
+ * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
41859
+ * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
41860
+ * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
41861
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
41862
+ * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
41854
41863
  *
41855
41864
  */
41856
41865
  bidStrategy?: (BidStrategy);
@@ -41877,7 +41886,7 @@ type UpdateAdSetData = {
41877
41886
  /**
41878
41887
  * Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
41879
41888
  * bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP. Internally converted to Meta's
41880
- * smallest-denomination integer, or (on OpenAI) to micros (× 1,000,000). Meta only:
41889
+ * smallest-denomination integer, or (on OpenAI and X) to micros (× 1,000,000). Meta only:
41881
41890
  * may be sent alone, WITHOUT bidStrategy, to update the cap amount on an ad set whose
41882
41891
  * parent campaign is COST_CAP or LOWEST_COST_WITH_BID_CAP (the strategy is inherited
41883
41892
  * from the campaign and is left untouched).
@@ -42193,7 +42202,7 @@ type GetAdData = {
42193
42202
  };
42194
42203
  query?: {
42195
42204
  /**
42196
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
42205
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
42197
42206
  */
42198
42207
  live?: boolean;
42199
42208
  };
@@ -46385,6 +46394,10 @@ type BoostPostData = {
46385
46394
  * Goes together with budgetAmount. lifetime requires schedule.endDate.
46386
46395
  */
46387
46396
  budgetType?: 'daily' | 'lifetime';
46397
+ /**
46398
+ * X only. A lifetime total, in whole currency units, that caps a daily budget (budgetType daily): the line item gets both daily_budget_amount_local_micro and total_budget_amount_local_micro, and stops spending once the total is reached. Must be at least budgetAmount. Read back as budget.daily and budget.lifetime. 400 on a lifetime budget or on another platform.
46399
+ */
46400
+ lifetimeBudgetCap?: number;
46388
46401
  /**
46389
46402
  * Alias of budgetAmount + budgetType, kept for existing callers
46390
46403
  * @deprecated
@@ -46421,7 +46434,7 @@ type BoostPostData = {
46421
46434
  */
46422
46435
  startDate?: string;
46423
46436
  /**
46424
- * Ad-set end time (ISO 8601), mapped to the ad set's `end_time`. Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46437
+ * Ad-set end time (ISO 8601), mapped to the ad set's `end_time` (on X, the line item's `end_time`; X campaigns carry no flight dates). Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46425
46438
  */
46426
46439
  endDate?: string;
46427
46440
  /**
package/dist/index.js CHANGED
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(index_exports);
36
36
  // package.json
37
37
  var package_default = {
38
38
  name: "@zernio/node",
39
- version: "0.2.1168",
39
+ version: "0.2.1169",
40
40
  description: "The official Node.js library for the Zernio API",
41
41
  main: "dist/index.js",
42
42
  module: "dist/index.mjs",
package/dist/index.mjs CHANGED
@@ -5,7 +5,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
5
5
  // package.json
6
6
  var package_default = {
7
7
  name: "@zernio/node",
8
- version: "0.2.1168",
8
+ version: "0.2.1169",
9
9
  description: "The official Node.js library for the Zernio API",
10
10
  main: "dist/index.js",
11
11
  module: "dist/index.mjs",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zernio/node",
3
- "version": "0.2.1168",
3
+ "version": "0.2.1169",
4
4
  "description": "The official Node.js library for the Zernio API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -10054,9 +10054,15 @@ export const updateAdCampaign = <ThrowOnError extends boolean = false>(options:
10054
10054
  * to resolve, so it is invisible to `/v1/ads/tree` and this endpoint would
10055
10055
  * 404. That state is produced by the two-step create flow (campaign, then
10056
10056
  * ads via `existingCampaignId`) whenever Meta rejects the ad step. To
10057
- * delete such a shell, send `accountId` in the body: we skip the local
10058
- * lookup entirely and forward the delete to Meta. `accountId` is ignored
10059
- * when the campaign does have ads.
10057
+ * delete such a shell, send `accountId` in the body or the query string:
10058
+ * we skip the local lookup entirely and forward the delete to Meta, or to
10059
+ * X when `accountId` is an X or X Ads connection. On X the ad account comes
10060
+ * from the synced campaign, which wins over `adAccountId`; when the campaign
10061
+ * was never synced, send `adAccountId` too. Before deleting, Zernio asks X
10062
+ * whether the campaign still holds undeleted line items (ads not synced
10063
+ * yet); if it does the answer is 409 and nothing is deleted, so sync the ad
10064
+ * account and retry. Other platforms answer 501 for an empty campaign.
10065
+ * `accountId` is ignored when the campaign does have ads.
10060
10066
  *
10061
10067
  */
10062
10068
  export const deleteAdCampaign = <ThrowOnError extends boolean = false>(options: OptionsLegacyParser<DeleteAdCampaignData, ThrowOnError>) => {
@@ -10714,7 +10720,7 @@ export const updateAd = <ThrowOnError extends boolean = false>(options: OptionsL
10714
10720
  *
10715
10721
  * Deletes the ad on the platform and marks it as cancelled in the database. The ad is preserved for history. OpenAI Ads has no delete API; the ad is archived instead (a terminal state, the closest equivalent).
10716
10722
  *
10717
- * Only the ad is deleted; a campaign or ad set is never deleted while it still holds another ad. On Meta, when the ad set and campaign were created by Zernio (by `POST /v1/ads/create` or `POST /v1/ads/boost`) and Meta lists no other ad in the ad set (archived ads count), the emptied ad set is deleted too, then the campaign once it holds no other ad set. Parents created outside Zernio, and the parents of an ad imported from the platform, are always kept. On LinkedIn the ad is a creative inside a campaign inside a campaign group: the creative is always removed, the campaign only when Zernio created it and LinkedIn lists no other creative in it that is not archived, canceled or deleted, and the campaign group only when Zernio created it and LinkedIn lists no other campaign in it that is not canceled or deleted (archived campaigns count). If the creative itself cannot be removed the request fails and no parent is touched. To delete a whole campaign on purpose use `DELETE /v1/ads/campaigns/{campaignId}`.
10723
+ * Only the ad is deleted; a campaign or ad set is never deleted while it still holds another ad. On Meta, when the ad set and campaign were created by Zernio (by `POST /v1/ads/create` or `POST /v1/ads/boost`) and Meta lists no other ad in the ad set (archived ads count), the emptied ad set is deleted too, then the campaign once it holds no other ad set. Parents created outside Zernio, and the parents of an ad imported from the platform, are always kept. On LinkedIn the ad is a creative inside a campaign inside a campaign group: the creative is always removed, the campaign only when Zernio created it and LinkedIn lists no other creative in it that is not archived, canceled or deleted, and the campaign group only when Zernio created it and LinkedIn lists no other campaign in it that is not canceled or deleted (archived campaigns count). If the creative itself cannot be removed the request fails and no parent is touched. On X the ad is a promoted post inside a line item inside a campaign: the promoted post is always removed, the line item only when Zernio created it (by `POST /v1/ads/create` or `POST /v1/ads/boost`) and X lists no other undeleted promoted post in it, and the campaign only when Zernio created it and X lists no other undeleted line item in it. If X refuses the promoted post delete the request fails and no parent is touched. To delete a whole campaign on purpose use `DELETE /v1/ads/campaigns/{campaignId}`.
10718
10724
  *
10719
10725
  */
10720
10726
  export const deleteAd = <ThrowOnError extends boolean = false>(options: OptionsLegacyParser<DeleteAdData, ThrowOnError>) => {
@@ -135,11 +135,11 @@ export type Ad = {
135
135
  amount?: number;
136
136
  type?: 'daily' | 'lifetime';
137
137
  /**
138
- * LinkedIn only. The parent campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
138
+ * LinkedIn and X only. The daily budget (LinkedIn: the parent campaign's `dailyBudget`; X: the line item's, or the campaign's when the line item has none). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
139
139
  */
140
140
  daily?: number;
141
141
  /**
142
- * LinkedIn only. The parent campaign's `totalBudget`, readable even when a daily budget is also set.
142
+ * LinkedIn and X only. The lifetime total (LinkedIn: the parent campaign's `totalBudget`; X: `total_budget_amount_local_micro`, for example the `lifetimeBudgetCap` of a boost), readable even when a daily budget is also set.
143
143
  */
144
144
  lifetime?: number;
145
145
  /**
@@ -1405,11 +1405,11 @@ export type AdTreeAdSet = {
1405
1405
  amount?: number;
1406
1406
  type?: 'daily' | 'lifetime';
1407
1407
  /**
1408
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
1408
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
1409
1409
  */
1410
1410
  daily?: number;
1411
1411
  /**
1412
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
1412
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
1413
1413
  */
1414
1414
  lifetime?: number;
1415
1415
  /**
@@ -9067,7 +9067,7 @@ export type ParameterCatalogTokenAccountId = string;
9067
9067
  export type ParameterIdempotencyKeyHeader = string;
9068
9068
 
9069
9069
  /**
9070
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
9070
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
9071
9071
  */
9072
9072
  export type ParameterLiveStatusRead = boolean;
9073
9073
 
@@ -41028,7 +41028,7 @@ export type ListAdCampaignsData = {
41028
41028
  includeEmpty?: boolean;
41029
41029
  limit?: number;
41030
41030
  /**
41031
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
41031
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
41032
41032
  */
41033
41033
  live?: boolean;
41034
41034
  /**
@@ -41509,11 +41509,15 @@ export type UpdateAdCampaignError = (unknown | ErrorResponse);
41509
41509
 
41510
41510
  export type DeleteAdCampaignData = {
41511
41511
  body: {
41512
- platform: 'facebook' | 'instagram' | 'google';
41512
+ platform: 'facebook' | 'instagram' | 'google' | 'twitter';
41513
41513
  /**
41514
41514
  * Zernio SocialAccount id owning the ad account. Required only to delete an EMPTY campaign (zero ads), which has no local Ad documents to resolve a token from.
41515
41515
  */
41516
41516
  accountId?: string;
41517
+ /**
41518
+ * X only, for an EMPTY campaign that was never synced: the X ad account id the campaign belongs to (lowercase letters and digits). The synced campaign's ad account wins when there is one. Also accepted on the query string.
41519
+ */
41520
+ adAccountId?: string;
41517
41521
  };
41518
41522
  path: {
41519
41523
  /**
@@ -41966,7 +41970,7 @@ export type ListAdSetsData = {
41966
41970
  */
41967
41971
  campaignId?: string;
41968
41972
  /**
41969
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
41973
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
41970
41974
  */
41971
41975
  live?: boolean;
41972
41976
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
@@ -41992,11 +41996,11 @@ export type ListAdSetsResponse = ({
41992
41996
  amount?: number;
41993
41997
  type?: 'daily' | 'lifetime';
41994
41998
  /**
41995
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41999
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41996
42000
  */
41997
42001
  daily?: number;
41998
42002
  /**
41999
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
42003
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
42000
42004
  */
42001
42005
  lifetime?: number;
42002
42006
  /**
@@ -42314,11 +42318,11 @@ export type UpdateAdSetData = {
42314
42318
  type?: 'daily' | 'lifetime';
42315
42319
  };
42316
42320
  /**
42317
- * Writes the ad set's own on/off switch (Meta: `configured_status`) on Meta and LinkedIn, whatever delivery status its ads report. Omit if not toggling delivery state.
42321
+ * Writes the ad set's own on/off switch (Meta: `configured_status`; X: the line item's `entity_status` ACTIVE / PAUSED), whatever delivery status its ads report. Omit if not toggling delivery state.
42318
42322
  */
42319
42323
  status?: 'active' | 'paused';
42320
42324
  /**
42321
- * Rename the ad set (Meta only; other platforms return 501). At least one of budget/status/bidStrategy/name is required.
42325
+ * Rename the ad set (on X, the line item `name`). Platforms without a rename return 501. At least one of budget/status/bidStrategy/name is required.
42322
42326
  */
42323
42327
  name?: string;
42324
42328
  /**
@@ -42328,8 +42332,13 @@ export type UpdateAdSetData = {
42328
42332
  * automatically. On OpenAI, LOWEST_COST_WITH_BID_CAP and COST_CAP both map to
42329
42333
  * the ad group's `bidding_config.max_bid_micros` (one knob covers both);
42330
42334
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422 (OpenAI has no ROAS-based
42331
- * bidding). Other platforms (linkedin, pinterest, google, twitter) return 501
42332
- * Not Implemented when bidStrategy is set.
42335
+ * bidding). On X it writes the line item's `bid_strategy`:
42336
+ * LOWEST_COST_WITHOUT_CAP = AUTO, LOWEST_COST_WITH_BID_CAP = MAX and
42337
+ * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
42338
+ * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
42339
+ * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
42340
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
42341
+ * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
42333
42342
  *
42334
42343
  */
42335
42344
  bidStrategy?: (BidStrategy);
@@ -42356,7 +42365,7 @@ export type UpdateAdSetData = {
42356
42365
  /**
42357
42366
  * Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
42358
42367
  * bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP. Internally converted to Meta's
42359
- * smallest-denomination integer, or (on OpenAI) to micros (× 1,000,000). Meta only:
42368
+ * smallest-denomination integer, or (on OpenAI and X) to micros (× 1,000,000). Meta only:
42360
42369
  * may be sent alone, WITHOUT bidStrategy, to update the cap amount on an ad set whose
42361
42370
  * parent campaign is COST_CAP or LOWEST_COST_WITH_BID_CAP (the strategy is inherited
42362
42371
  * from the campaign and is left untouched).
@@ -42687,7 +42696,7 @@ export type GetAdData = {
42687
42696
  };
42688
42697
  query?: {
42689
42698
  /**
42690
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
42699
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
42691
42700
  */
42692
42701
  live?: boolean;
42693
42702
  };
@@ -47173,6 +47182,10 @@ export type BoostPostData = {
47173
47182
  * Goes together with budgetAmount. lifetime requires schedule.endDate.
47174
47183
  */
47175
47184
  budgetType?: 'daily' | 'lifetime';
47185
+ /**
47186
+ * X only. A lifetime total, in whole currency units, that caps a daily budget (budgetType daily): the line item gets both daily_budget_amount_local_micro and total_budget_amount_local_micro, and stops spending once the total is reached. Must be at least budgetAmount. Read back as budget.daily and budget.lifetime. 400 on a lifetime budget or on another platform.
47187
+ */
47188
+ lifetimeBudgetCap?: number;
47176
47189
  /**
47177
47190
  * Alias of budgetAmount + budgetType, kept for existing callers
47178
47191
  * @deprecated
@@ -47209,7 +47222,7 @@ export type BoostPostData = {
47209
47222
  */
47210
47223
  startDate?: string;
47211
47224
  /**
47212
- * Ad-set end time (ISO 8601), mapped to the ad set's `end_time`. Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
47225
+ * Ad-set end time (ISO 8601), mapped to the ad set's `end_time` (on X, the line item's `end_time`; X campaigns carry no flight dates). Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
47213
47226
  */
47214
47227
  endDate?: string;
47215
47228
  /**