@zernio/node 0.2.206 → 0.2.208

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
@@ -8198,6 +8198,11 @@ type SelectFacebookPageError = (unknown | {
8198
8198
  });
8199
8199
  type ListGoogleBusinessLocationsData = {
8200
8200
  query?: {
8201
+ /**
8202
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search). Supports fields such as title, storeCode, storefront_address.postal_code, labels and categories, e.g. storeCode="LH279411". See Google's "Work with location data" guide.
8203
+ *
8204
+ */
8205
+ filter?: string;
8201
8206
  /**
8202
8207
  * Token from the OAuth callback redirect. Preferred over tempToken because it preserves server-side token storage. One of pendingDataToken or tempToken is required.
8203
8208
  */
@@ -8206,6 +8211,11 @@ type ListGoogleBusinessLocationsData = {
8206
8211
  * Profile ID from your connection flow. Required for auth validation when provided.
8207
8212
  */
8208
8213
  profileId?: string;
8214
+ /**
8215
+ * Free-text search on the business name, applied server-side by Google. Use this for accounts that own many locations (the response is bounded, see hasMore) so the user can find a specific location without loading the full list.
8216
+ *
8217
+ */
8218
+ search?: string;
8209
8219
  /**
8210
8220
  * Legacy. Direct Google access token. Use pendingDataToken instead when available.
8211
8221
  */
@@ -8238,7 +8248,16 @@ type ListGoogleBusinessLocationsResponse = ({
8238
8248
  * Business category
8239
8249
  */
8240
8250
  category?: string;
8251
+ /**
8252
+ * Store code set on the location in Google Business Profile (if any)
8253
+ */
8254
+ storeCode?: string;
8241
8255
  }>;
8256
+ /**
8257
+ * True when more locations exist than were returned (the list is bounded). Prompt the user to narrow the result set with search.
8258
+ *
8259
+ */
8260
+ hasMore?: boolean;
8242
8261
  });
8243
8262
  type ListGoogleBusinessLocationsError = (unknown | {
8244
8263
  error?: string;
@@ -8253,6 +8272,11 @@ type SelectGoogleBusinessLocationData = {
8253
8272
  * The Google Business location ID selected by the user
8254
8273
  */
8255
8274
  locationId: string;
8275
+ /**
8276
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the selected location (returned per-location by GET /v1/connect/googlebusiness/locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts that own many locations. Omit only for small accounts.
8277
+ *
8278
+ */
8279
+ accountId?: string;
8256
8280
  /**
8257
8281
  * Token from the OAuth callback redirect (pendingDataToken query param). Tokens and profile data are retrieved server-side from this token.
8258
8282
  */
@@ -10462,6 +10486,16 @@ type GetGmbLocationsData = {
10462
10486
  path: {
10463
10487
  accountId: string;
10464
10488
  };
10489
+ query?: {
10490
+ /**
10491
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search), e.g. storeCode="LH279411".
10492
+ */
10493
+ filter?: string;
10494
+ /**
10495
+ * Free-text search on the business name, applied server-side by Google. Use for accounts with many locations.
10496
+ */
10497
+ search?: string;
10498
+ };
10465
10499
  };
10466
10500
  type GetGmbLocationsResponse = ({
10467
10501
  locations?: Array<{
@@ -10472,7 +10506,12 @@ type GetGmbLocationsResponse = ({
10472
10506
  address?: string;
10473
10507
  category?: string;
10474
10508
  websiteUrl?: string;
10509
+ storeCode?: string;
10475
10510
  }>;
10511
+ /**
10512
+ * True when more locations exist than were returned (use search to narrow down).
10513
+ */
10514
+ hasMore?: boolean;
10476
10515
  selectedLocationId?: string;
10477
10516
  cached?: boolean;
10478
10517
  });
@@ -10482,6 +10521,11 @@ type GetGmbLocationsError = ({
10482
10521
  type UpdateGmbLocationData = {
10483
10522
  body: {
10484
10523
  selectedLocationId: string;
10524
+ /**
10525
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the new location (from GET gmb-locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts with many locations.
10526
+ *
10527
+ */
10528
+ accountId?: string;
10485
10529
  };
10486
10530
  path: {
10487
10531
  accountId: string;
@@ -18044,36 +18088,53 @@ type CreateStandaloneAdData = {
18044
18088
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE';
18045
18089
  };
18046
18090
  /**
18047
- * Meta only. Placement asset customization: pin a SPECIFIC image to each placement
18048
- * group on a SINGLE ad (e.g. a 9:16 image on Stories/Reels and a 4:5 on Feed). This
18049
- * is the same thing Meta Ads Manager produces with "different creative per placement",
18050
- * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. It is
18051
- * deterministic pinning, NOT the auto-optimizing pool of `dynamicCreative` (the two are
18052
- * mutually exclusive, and it cannot be combined with `creatives[]` or `adSetId`). The
18053
- * shared copy (headline, body, link, CTA) comes from the top-level single-creative
18054
- * fields (`headline`, `body`, `linkUrl`, `callToAction`) since only the image varies by
18091
+ * Meta only. Placement asset customization: pin a SPECIFIC asset (image OR video) to
18092
+ * each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed).
18093
+ * The same thing Meta Ads Manager produces with "different creative per placement",
18094
+ * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. Deterministic
18095
+ * pinning, NOT the auto-optimizing pool of `dynamicCreative` (mutually exclusive, and it
18096
+ * cannot be combined with `creatives[]` or `adSetId`). Shared copy (headline, body, link,
18097
+ * CTA) comes from the top-level single-creative fields since only the asset varies by
18055
18098
  * placement. Each rule's `placements` accepts the same fields as the top-level
18056
18099
  * `placements` object; Meta enforces co-selection rules and returns an actionable error.
18057
18100
  *
18101
+ * A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad
18102
+ * format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode:
18103
+ * `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl`
18104
+ * posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
18105
+ *
18058
18106
  */
18059
18107
  placementAssets?: {
18060
18108
  /**
18061
- * Catch-all image for any placement not matched by a rule. REQUIRED Meta mandates
18062
- * a default asset customization rule (empty placement spec, lowest priority) on every
18063
- * placement-customized creative.
18064
- *
18109
+ * Image mode. Catch-all image for any placement no rule matches. Required in image mode (Meta mandates a default rule).
18110
+ */
18111
+ defaultImageUrl?: string;
18112
+ /**
18113
+ * Video mode. Catch-all video for any placement no rule matches. Required in video mode.
18114
+ */
18115
+ defaultVideoUrl?: string;
18116
+ /**
18117
+ * Video mode (optional). Poster image for the default video; Meta auto-generates one when omitted.
18065
18118
  */
18066
- defaultImageUrl: string;
18119
+ defaultThumbnailUrl?: string;
18067
18120
  /**
18068
- * One entry per placement group you want to pin a specific image to.
18121
+ * One entry per placement group you want to pin a specific asset to.
18069
18122
  */
18070
18123
  rules: Array<{
18071
18124
  /**
18072
- * The image to deliver for this rule's placements.
18125
+ * Image mode. The image to deliver for this rule's placements.
18126
+ */
18127
+ imageUrl?: string;
18128
+ /**
18129
+ * Video mode. The video to deliver for this rule's placements.
18130
+ */
18131
+ videoUrl?: string;
18132
+ /**
18133
+ * Video mode (optional). Poster image for this rule's video; auto-generated when omitted.
18073
18134
  */
18074
- imageUrl: string;
18135
+ thumbnailUrl?: string;
18075
18136
  /**
18076
- * Placements this image is pinned to. At least one field must be set (an empty rule is invalid — that role is served by defaultImageUrl). Same enums as the top-level `placements` object.
18137
+ * Placements this asset is pinned to. At least one field must be set (an empty rule is invalid — that role is served by the default asset). Same enums as the top-level `placements` object.
18077
18138
  */
18078
18139
  placements: {
18079
18140
  publisherPlatforms?: Array<('facebook' | 'instagram' | 'threads' | 'messenger' | 'audience_network')>;
package/dist/index.d.ts CHANGED
@@ -8198,6 +8198,11 @@ type SelectFacebookPageError = (unknown | {
8198
8198
  });
8199
8199
  type ListGoogleBusinessLocationsData = {
8200
8200
  query?: {
8201
+ /**
8202
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search). Supports fields such as title, storeCode, storefront_address.postal_code, labels and categories, e.g. storeCode="LH279411". See Google's "Work with location data" guide.
8203
+ *
8204
+ */
8205
+ filter?: string;
8201
8206
  /**
8202
8207
  * Token from the OAuth callback redirect. Preferred over tempToken because it preserves server-side token storage. One of pendingDataToken or tempToken is required.
8203
8208
  */
@@ -8206,6 +8211,11 @@ type ListGoogleBusinessLocationsData = {
8206
8211
  * Profile ID from your connection flow. Required for auth validation when provided.
8207
8212
  */
8208
8213
  profileId?: string;
8214
+ /**
8215
+ * Free-text search on the business name, applied server-side by Google. Use this for accounts that own many locations (the response is bounded, see hasMore) so the user can find a specific location without loading the full list.
8216
+ *
8217
+ */
8218
+ search?: string;
8209
8219
  /**
8210
8220
  * Legacy. Direct Google access token. Use pendingDataToken instead when available.
8211
8221
  */
@@ -8238,7 +8248,16 @@ type ListGoogleBusinessLocationsResponse = ({
8238
8248
  * Business category
8239
8249
  */
8240
8250
  category?: string;
8251
+ /**
8252
+ * Store code set on the location in Google Business Profile (if any)
8253
+ */
8254
+ storeCode?: string;
8241
8255
  }>;
8256
+ /**
8257
+ * True when more locations exist than were returned (the list is bounded). Prompt the user to narrow the result set with search.
8258
+ *
8259
+ */
8260
+ hasMore?: boolean;
8242
8261
  });
8243
8262
  type ListGoogleBusinessLocationsError = (unknown | {
8244
8263
  error?: string;
@@ -8253,6 +8272,11 @@ type SelectGoogleBusinessLocationData = {
8253
8272
  * The Google Business location ID selected by the user
8254
8273
  */
8255
8274
  locationId: string;
8275
+ /**
8276
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the selected location (returned per-location by GET /v1/connect/googlebusiness/locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts that own many locations. Omit only for small accounts.
8277
+ *
8278
+ */
8279
+ accountId?: string;
8256
8280
  /**
8257
8281
  * Token from the OAuth callback redirect (pendingDataToken query param). Tokens and profile data are retrieved server-side from this token.
8258
8282
  */
@@ -10462,6 +10486,16 @@ type GetGmbLocationsData = {
10462
10486
  path: {
10463
10487
  accountId: string;
10464
10488
  };
10489
+ query?: {
10490
+ /**
10491
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search), e.g. storeCode="LH279411".
10492
+ */
10493
+ filter?: string;
10494
+ /**
10495
+ * Free-text search on the business name, applied server-side by Google. Use for accounts with many locations.
10496
+ */
10497
+ search?: string;
10498
+ };
10465
10499
  };
10466
10500
  type GetGmbLocationsResponse = ({
10467
10501
  locations?: Array<{
@@ -10472,7 +10506,12 @@ type GetGmbLocationsResponse = ({
10472
10506
  address?: string;
10473
10507
  category?: string;
10474
10508
  websiteUrl?: string;
10509
+ storeCode?: string;
10475
10510
  }>;
10511
+ /**
10512
+ * True when more locations exist than were returned (use search to narrow down).
10513
+ */
10514
+ hasMore?: boolean;
10476
10515
  selectedLocationId?: string;
10477
10516
  cached?: boolean;
10478
10517
  });
@@ -10482,6 +10521,11 @@ type GetGmbLocationsError = ({
10482
10521
  type UpdateGmbLocationData = {
10483
10522
  body: {
10484
10523
  selectedLocationId: string;
10524
+ /**
10525
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the new location (from GET gmb-locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts with many locations.
10526
+ *
10527
+ */
10528
+ accountId?: string;
10485
10529
  };
10486
10530
  path: {
10487
10531
  accountId: string;
@@ -18044,36 +18088,53 @@ type CreateStandaloneAdData = {
18044
18088
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE';
18045
18089
  };
18046
18090
  /**
18047
- * Meta only. Placement asset customization: pin a SPECIFIC image to each placement
18048
- * group on a SINGLE ad (e.g. a 9:16 image on Stories/Reels and a 4:5 on Feed). This
18049
- * is the same thing Meta Ads Manager produces with "different creative per placement",
18050
- * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. It is
18051
- * deterministic pinning, NOT the auto-optimizing pool of `dynamicCreative` (the two are
18052
- * mutually exclusive, and it cannot be combined with `creatives[]` or `adSetId`). The
18053
- * shared copy (headline, body, link, CTA) comes from the top-level single-creative
18054
- * fields (`headline`, `body`, `linkUrl`, `callToAction`) since only the image varies by
18091
+ * Meta only. Placement asset customization: pin a SPECIFIC asset (image OR video) to
18092
+ * each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed).
18093
+ * The same thing Meta Ads Manager produces with "different creative per placement",
18094
+ * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. Deterministic
18095
+ * pinning, NOT the auto-optimizing pool of `dynamicCreative` (mutually exclusive, and it
18096
+ * cannot be combined with `creatives[]` or `adSetId`). Shared copy (headline, body, link,
18097
+ * CTA) comes from the top-level single-creative fields since only the asset varies by
18055
18098
  * placement. Each rule's `placements` accepts the same fields as the top-level
18056
18099
  * `placements` object; Meta enforces co-selection rules and returns an actionable error.
18057
18100
  *
18101
+ * A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad
18102
+ * format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode:
18103
+ * `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl`
18104
+ * posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
18105
+ *
18058
18106
  */
18059
18107
  placementAssets?: {
18060
18108
  /**
18061
- * Catch-all image for any placement not matched by a rule. REQUIRED Meta mandates
18062
- * a default asset customization rule (empty placement spec, lowest priority) on every
18063
- * placement-customized creative.
18064
- *
18109
+ * Image mode. Catch-all image for any placement no rule matches. Required in image mode (Meta mandates a default rule).
18110
+ */
18111
+ defaultImageUrl?: string;
18112
+ /**
18113
+ * Video mode. Catch-all video for any placement no rule matches. Required in video mode.
18114
+ */
18115
+ defaultVideoUrl?: string;
18116
+ /**
18117
+ * Video mode (optional). Poster image for the default video; Meta auto-generates one when omitted.
18065
18118
  */
18066
- defaultImageUrl: string;
18119
+ defaultThumbnailUrl?: string;
18067
18120
  /**
18068
- * One entry per placement group you want to pin a specific image to.
18121
+ * One entry per placement group you want to pin a specific asset to.
18069
18122
  */
18070
18123
  rules: Array<{
18071
18124
  /**
18072
- * The image to deliver for this rule's placements.
18125
+ * Image mode. The image to deliver for this rule's placements.
18126
+ */
18127
+ imageUrl?: string;
18128
+ /**
18129
+ * Video mode. The video to deliver for this rule's placements.
18130
+ */
18131
+ videoUrl?: string;
18132
+ /**
18133
+ * Video mode (optional). Poster image for this rule's video; auto-generated when omitted.
18073
18134
  */
18074
- imageUrl: string;
18135
+ thumbnailUrl?: string;
18075
18136
  /**
18076
- * Placements this image is pinned to. At least one field must be set (an empty rule is invalid — that role is served by defaultImageUrl). Same enums as the top-level `placements` object.
18137
+ * Placements this asset is pinned to. At least one field must be set (an empty rule is invalid — that role is served by the default asset). Same enums as the top-level `placements` object.
18077
18138
  */
18078
18139
  placements: {
18079
18140
  publisherPlatforms?: Array<('facebook' | 'instagram' | 'threads' | 'messenger' | 'audience_network')>;
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.206",
39
+ version: "0.2.208",
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.206",
8
+ version: "0.2.208",
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.206",
3
+ "version": "0.2.208",
4
4
  "description": "The official Node.js library for the Zernio API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -1672,7 +1672,8 @@ export const updateYoutubeDefaultPlaylist = <ThrowOnError extends boolean = fals
1672
1672
 
1673
1673
  /**
1674
1674
  * List GBP locations
1675
- * Returns all Google Business Profile locations the connected account has access to, including the currently selected location.
1675
+ * Returns Google Business Profile locations the connected account can access, plus the currently selected location. The list is bounded (see hasMore); for accounts that own many locations, use the search or filter query params to find a specific one instead of loading them all.
1676
+ *
1676
1677
  */
1677
1678
  export const getGmbLocations = <ThrowOnError extends boolean = false>(options: OptionsLegacyParser<GetGmbLocationsData, ThrowOnError>) => {
1678
1679
  return (options?.client ?? client).get<GetGmbLocationsResponse, GetGmbLocationsError, ThrowOnError>({
@@ -7892,6 +7892,11 @@ export type SelectFacebookPageError = (unknown | {
7892
7892
 
7893
7893
  export type ListGoogleBusinessLocationsData = {
7894
7894
  query?: {
7895
+ /**
7896
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search). Supports fields such as title, storeCode, storefront_address.postal_code, labels and categories, e.g. storeCode="LH279411". See Google's "Work with location data" guide.
7897
+ *
7898
+ */
7899
+ filter?: string;
7895
7900
  /**
7896
7901
  * Token from the OAuth callback redirect. Preferred over tempToken because it preserves server-side token storage. One of pendingDataToken or tempToken is required.
7897
7902
  */
@@ -7900,6 +7905,11 @@ export type ListGoogleBusinessLocationsData = {
7900
7905
  * Profile ID from your connection flow. Required for auth validation when provided.
7901
7906
  */
7902
7907
  profileId?: string;
7908
+ /**
7909
+ * Free-text search on the business name, applied server-side by Google. Use this for accounts that own many locations (the response is bounded, see hasMore) so the user can find a specific location without loading the full list.
7910
+ *
7911
+ */
7912
+ search?: string;
7903
7913
  /**
7904
7914
  * Legacy. Direct Google access token. Use pendingDataToken instead when available.
7905
7915
  */
@@ -7933,7 +7943,16 @@ export type ListGoogleBusinessLocationsResponse = ({
7933
7943
  * Business category
7934
7944
  */
7935
7945
  category?: string;
7946
+ /**
7947
+ * Store code set on the location in Google Business Profile (if any)
7948
+ */
7949
+ storeCode?: string;
7936
7950
  }>;
7951
+ /**
7952
+ * True when more locations exist than were returned (the list is bounded). Prompt the user to narrow the result set with search.
7953
+ *
7954
+ */
7955
+ hasMore?: boolean;
7937
7956
  });
7938
7957
 
7939
7958
  export type ListGoogleBusinessLocationsError = (unknown | {
@@ -7950,6 +7969,11 @@ export type SelectGoogleBusinessLocationData = {
7950
7969
  * The Google Business location ID selected by the user
7951
7970
  */
7952
7971
  locationId: string;
7972
+ /**
7973
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the selected location (returned per-location by GET /v1/connect/googlebusiness/locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts that own many locations. Omit only for small accounts.
7974
+ *
7975
+ */
7976
+ accountId?: string;
7953
7977
  /**
7954
7978
  * Token from the OAuth callback redirect (pendingDataToken query param). Tokens and profile data are retrieved server-side from this token.
7955
7979
  */
@@ -10315,6 +10339,16 @@ export type GetGmbLocationsData = {
10315
10339
  path: {
10316
10340
  accountId: string;
10317
10341
  };
10342
+ query?: {
10343
+ /**
10344
+ * Raw Google Business Information API filter expression (advanced; takes precedence over search), e.g. storeCode="LH279411".
10345
+ */
10346
+ filter?: string;
10347
+ /**
10348
+ * Free-text search on the business name, applied server-side by Google. Use for accounts with many locations.
10349
+ */
10350
+ search?: string;
10351
+ };
10318
10352
  };
10319
10353
 
10320
10354
  export type GetGmbLocationsResponse = ({
@@ -10326,7 +10360,12 @@ export type GetGmbLocationsResponse = ({
10326
10360
  address?: string;
10327
10361
  category?: string;
10328
10362
  websiteUrl?: string;
10363
+ storeCode?: string;
10329
10364
  }>;
10365
+ /**
10366
+ * True when more locations exist than were returned (use search to narrow down).
10367
+ */
10368
+ hasMore?: boolean;
10330
10369
  selectedLocationId?: string;
10331
10370
  cached?: boolean;
10332
10371
  });
@@ -10338,6 +10377,11 @@ export type GetGmbLocationsError = ({
10338
10377
  export type UpdateGmbLocationData = {
10339
10378
  body: {
10340
10379
  selectedLocationId: string;
10380
+ /**
10381
+ * Optional but recommended. The Google Business Account resource name ("accounts/123") that owns the new location (from GET gmb-locations). When provided, the location is resolved directly instead of by enumerating the account, which is required for accounts with many locations.
10382
+ *
10383
+ */
10384
+ accountId?: string;
10341
10385
  };
10342
10386
  path: {
10343
10387
  accountId: string;
@@ -18509,36 +18553,53 @@ export type CreateStandaloneAdData = {
18509
18553
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE';
18510
18554
  };
18511
18555
  /**
18512
- * Meta only. Placement asset customization: pin a SPECIFIC image to each placement
18513
- * group on a SINGLE ad (e.g. a 9:16 image on Stories/Reels and a 4:5 on Feed). This
18514
- * is the same thing Meta Ads Manager produces with "different creative per placement",
18515
- * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. It is
18516
- * deterministic pinning, NOT the auto-optimizing pool of `dynamicCreative` (the two are
18517
- * mutually exclusive, and it cannot be combined with `creatives[]` or `adSetId`). The
18518
- * shared copy (headline, body, link, CTA) comes from the top-level single-creative
18519
- * fields (`headline`, `body`, `linkUrl`, `callToAction`) since only the image varies by
18556
+ * Meta only. Placement asset customization: pin a SPECIFIC asset (image OR video) to
18557
+ * each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed).
18558
+ * The same thing Meta Ads Manager produces with "different creative per placement",
18559
+ * mapped to the creative's `asset_feed_spec` + `asset_customization_rules`. Deterministic
18560
+ * pinning, NOT the auto-optimizing pool of `dynamicCreative` (mutually exclusive, and it
18561
+ * cannot be combined with `creatives[]` or `adSetId`). Shared copy (headline, body, link,
18562
+ * CTA) comes from the top-level single-creative fields since only the asset varies by
18520
18563
  * placement. Each rule's `placements` accepts the same fields as the top-level
18521
18564
  * `placements` object; Meta enforces co-selection rules and returns an actionable error.
18522
18565
  *
18566
+ * A block is all-image OR all-video, never mixed (Meta's asset_feed_spec carries one ad
18567
+ * format). Image mode: `defaultImageUrl` + `rules[].imageUrl`. Video mode:
18568
+ * `defaultVideoUrl` + `rules[].videoUrl` (optional `thumbnailUrl`/`defaultThumbnailUrl`
18569
+ * posters; Meta auto-generates when omitted). Exactly one catch-all default is required.
18570
+ *
18523
18571
  */
18524
18572
  placementAssets?: {
18525
18573
  /**
18526
- * Catch-all image for any placement not matched by a rule. REQUIRED Meta mandates
18527
- * a default asset customization rule (empty placement spec, lowest priority) on every
18528
- * placement-customized creative.
18529
- *
18574
+ * Image mode. Catch-all image for any placement no rule matches. Required in image mode (Meta mandates a default rule).
18575
+ */
18576
+ defaultImageUrl?: string;
18577
+ /**
18578
+ * Video mode. Catch-all video for any placement no rule matches. Required in video mode.
18579
+ */
18580
+ defaultVideoUrl?: string;
18581
+ /**
18582
+ * Video mode (optional). Poster image for the default video; Meta auto-generates one when omitted.
18530
18583
  */
18531
- defaultImageUrl: string;
18584
+ defaultThumbnailUrl?: string;
18532
18585
  /**
18533
- * One entry per placement group you want to pin a specific image to.
18586
+ * One entry per placement group you want to pin a specific asset to.
18534
18587
  */
18535
18588
  rules: Array<{
18536
18589
  /**
18537
- * The image to deliver for this rule's placements.
18590
+ * Image mode. The image to deliver for this rule's placements.
18591
+ */
18592
+ imageUrl?: string;
18593
+ /**
18594
+ * Video mode. The video to deliver for this rule's placements.
18595
+ */
18596
+ videoUrl?: string;
18597
+ /**
18598
+ * Video mode (optional). Poster image for this rule's video; auto-generated when omitted.
18538
18599
  */
18539
- imageUrl: string;
18600
+ thumbnailUrl?: string;
18540
18601
  /**
18541
- * Placements this image is pinned to. At least one field must be set (an empty rule is invalid — that role is served by defaultImageUrl). Same enums as the top-level `placements` object.
18602
+ * Placements this asset is pinned to. At least one field must be set (an empty rule is invalid — that role is served by the default asset). Same enums as the top-level `placements` object.
18542
18603
  */
18543
18604
  placements: {
18544
18605
  publisherPlatforms?: Array<('facebook' | 'instagram' | 'threads' | 'messenger' | 'audience_network')>;