@zernio/node 0.2.200 → 0.2.202

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.
@@ -1251,6 +1251,74 @@ export type DiscordPlatformData = {
1251
1251
  */
1252
1252
  export type autoArchiveDuration = 60 | 1440 | 4320 | 10080;
1253
1253
 
1254
+ /**
1255
+ * Discord guild scheduled event. Returned by /v1/discord/guilds/{guildId}/events endpoints.
1256
+ * Fields below are the subset Zernio consumes — Discord may return more (e.g. creator,
1257
+ * image hash) which we pass through verbatim.
1258
+ *
1259
+ */
1260
+ export type DiscordScheduledEvent = {
1261
+ /**
1262
+ * Event snowflake ID
1263
+ */
1264
+ id?: string;
1265
+ guild_id?: string;
1266
+ /**
1267
+ * Voice/stage channel ID; null for external events.
1268
+ */
1269
+ channel_id?: (string) | null;
1270
+ creator_id?: (string) | null;
1271
+ name?: string;
1272
+ description?: (string) | null;
1273
+ scheduled_start_time?: string;
1274
+ /**
1275
+ * Required for external events; optional for voice/stage.
1276
+ */
1277
+ scheduled_end_time?: (string) | null;
1278
+ /**
1279
+ * Always 2 (GUILD_ONLY) — Discord deprecated PUBLIC events.
1280
+ */
1281
+ privacy_level?: 2;
1282
+ /**
1283
+ * 1=SCHEDULED, 2=ACTIVE, 3=COMPLETED, 4=CANCELED
1284
+ */
1285
+ status?: 1 | 2 | 3 | 4;
1286
+ /**
1287
+ * 1=STAGE_INSTANCE, 2=VOICE, 3=EXTERNAL
1288
+ */
1289
+ entity_type?: 1 | 2 | 3;
1290
+ entity_id?: (string) | null;
1291
+ entity_metadata?: {
1292
+ /**
1293
+ * External event location string.
1294
+ */
1295
+ location?: string;
1296
+ } | null;
1297
+ /**
1298
+ * Number of members who RSVP'd. Only present when withUserCount=true on list.
1299
+ */
1300
+ user_count?: number;
1301
+ /**
1302
+ * Cover image hash; build URL via cdn.discordapp.com.
1303
+ */
1304
+ image?: (string) | null;
1305
+ };
1306
+
1307
+ /**
1308
+ * Always 2 (GUILD_ONLY) — Discord deprecated PUBLIC events.
1309
+ */
1310
+ export type privacy_level = 2;
1311
+
1312
+ /**
1313
+ * 1=SCHEDULED, 2=ACTIVE, 3=COMPLETED, 4=CANCELED
1314
+ */
1315
+ export type status3 = 1 | 2 | 3 | 4;
1316
+
1317
+ /**
1318
+ * 1=STAGE_INSTANCE, 2=VOICE, 3=EXTERNAL
1319
+ */
1320
+ export type entity_type = 1 | 2 | 3;
1321
+
1254
1322
  /**
1255
1323
  * A single inline button rendered inside an auto-DM via Meta's button_template.
1256
1324
  * Up to 3 buttons per automation. `url` and `postback` work on Instagram and
@@ -1586,7 +1654,7 @@ export type InboxWebhookConversation = {
1586
1654
  contactId?: string;
1587
1655
  };
1588
1656
 
1589
- export type status3 = 'active' | 'archived';
1657
+ export type status4 = 'active' | 'archived';
1590
1658
 
1591
1659
  /**
1592
1660
  * The message object included in inbox webhook payloads.
@@ -2130,7 +2198,7 @@ export type PlatformAnalytics = {
2130
2198
  errorMessage?: (string) | null;
2131
2199
  };
2132
2200
 
2133
- export type status4 = 'published' | 'failed';
2201
+ export type status5 = 'published' | 'failed';
2134
2202
 
2135
2203
  /**
2136
2204
  * Sync state of analytics for this platform
@@ -2240,7 +2308,7 @@ export type Post = {
2240
2308
  updatedAt?: string;
2241
2309
  };
2242
2310
 
2243
- export type status5 = 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed' | 'partial';
2311
+ export type status6 = 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed' | 'partial';
2244
2312
 
2245
2313
  export type visibility = 'public' | 'private' | 'unlisted';
2246
2314
 
@@ -3166,7 +3234,7 @@ export type UploadTokenResponse = {
3166
3234
  status?: 'pending' | 'completed' | 'expired';
3167
3235
  };
3168
3236
 
3169
- export type status6 = 'pending' | 'completed' | 'expired';
3237
+ export type status7 = 'pending' | 'completed' | 'expired';
3170
3238
 
3171
3239
  export type UploadTokenStatusResponse = {
3172
3240
  token?: string;
@@ -3485,7 +3553,7 @@ export type event = 'account.ads.initial_sync_completed';
3485
3553
  /**
3486
3554
  * Overall outcome of the initial sync.
3487
3555
  */
3488
- export type status7 = 'success' | 'failure';
3556
+ export type status8 = 'success' | 'failure';
3489
3557
 
3490
3558
  /**
3491
3559
  * Stable category for UX branching. New values may be added; existing ones are
@@ -4790,7 +4858,7 @@ export type platform10 = 'whatsapp';
4790
4858
  * request before the template is actually removed.
4791
4859
  *
4792
4860
  */
4793
- export type status8 = 'APPROVED' | 'REJECTED' | 'PENDING' | 'PAUSED' | 'DISABLED' | 'IN_APPEAL' | 'PENDING_DELETION';
4861
+ export type status9 = 'APPROVED' | 'REJECTED' | 'PENDING' | 'PAUSED' | 'DISABLED' | 'IN_APPEAL' | 'PENDING_DELETION';
4794
4862
 
4795
4863
  export type WhatsAppBodyComponent = {
4796
4864
  type: 'body';
@@ -4891,7 +4959,7 @@ export type WhatsAppSandboxSession = {
4891
4959
  * list responses.
4892
4960
  *
4893
4961
  */
4894
- export type status9 = 'pending' | 'active';
4962
+ export type status10 = 'pending' | 'active';
4895
4963
 
4896
4964
  export type WhatsAppTemplateButton = {
4897
4965
  type: 'quick_reply' | 'url' | 'phone_number' | 'otp' | 'flow' | 'mpm' | 'catalog';
@@ -5007,7 +5075,7 @@ export type WorkflowExecutionEvent = {
5007
5075
 
5008
5076
  export type action2 = 'execution_started' | 'execution_completed' | 'execution_exited' | 'execution_paused' | 'execution_resumed' | 'node_started' | 'node_completed' | 'node_failed' | 'node_skipped';
5009
5077
 
5010
- export type status10 = 'success' | 'failed' | 'pending';
5078
+ export type status11 = 'success' | 'failed' | 'pending';
5011
5079
 
5012
5080
  /**
5013
5081
  * A node in a workflow graph. `config` shape depends on `type`.
@@ -10442,6 +10510,450 @@ export type GetDiscordChannelsError = (unknown | {
10442
10510
  error?: string;
10443
10511
  });
10444
10512
 
10513
+ export type SendDiscordDirectMessageData = {
10514
+ body: {
10515
+ /**
10516
+ * SocialAccount _id of the connected Discord account the bot speaks as. Caller must own the account (directly or via team membership).
10517
+ */
10518
+ accountId: string;
10519
+ /**
10520
+ * Discord snowflake ID of the recipient (15-21 digits).
10521
+ */
10522
+ userId: string;
10523
+ /**
10524
+ * Message text, up to 2,000 characters.
10525
+ */
10526
+ content?: string;
10527
+ /**
10528
+ * Up to 10 Discord embeds. Same shape as channel-post embeds (title, description, color, fields, etc.). See DiscordPlatformData.embeds for the embed object schema.
10529
+ */
10530
+ embeds?: Array<{
10531
+ [key: string]: unknown;
10532
+ }>;
10533
+ /**
10534
+ * Up to 10 media attachments. Each is `{ type: image|video|gif|document, url, filename?, mimeType?, size? }`.
10535
+ */
10536
+ attachments?: Array<{
10537
+ type: 'image' | 'video' | 'gif' | 'document';
10538
+ url: string;
10539
+ filename?: string;
10540
+ mimeType?: string;
10541
+ size?: number;
10542
+ }>;
10543
+ /**
10544
+ * Send as text-to-speech message.
10545
+ */
10546
+ tts?: boolean;
10547
+ };
10548
+ };
10549
+
10550
+ export type SendDiscordDirectMessageResponse = ({
10551
+ /**
10552
+ * Discord message snowflake ID
10553
+ */
10554
+ messageId?: string;
10555
+ /**
10556
+ * DM channel snowflake (Discord auto-creates one per recipient pair)
10557
+ */
10558
+ channelId?: string;
10559
+ /**
10560
+ * Direct link to the message — uses Discord's @me path for DMs
10561
+ */
10562
+ url?: string;
10563
+ timestamp?: string;
10564
+ recipient?: {
10565
+ userId?: string;
10566
+ platform?: string;
10567
+ };
10568
+ account?: {
10569
+ id?: string;
10570
+ username?: string;
10571
+ displayName?: string;
10572
+ };
10573
+ });
10574
+
10575
+ export type SendDiscordDirectMessageError = (unknown | {
10576
+ error?: string;
10577
+ });
10578
+
10579
+ export type ListDiscordGuildRolesData = {
10580
+ path: {
10581
+ /**
10582
+ * Discord guild snowflake ID
10583
+ */
10584
+ guildId: string;
10585
+ };
10586
+ query: {
10587
+ /**
10588
+ * SocialAccount _id of the Discord account bound to this guild
10589
+ */
10590
+ accountId: string;
10591
+ };
10592
+ };
10593
+
10594
+ export type ListDiscordGuildRolesResponse = ({
10595
+ data?: Array<{
10596
+ /**
10597
+ * Role snowflake ID
10598
+ */
10599
+ id?: string;
10600
+ name?: string;
10601
+ /**
10602
+ * Decimal color (0 = no color). Convert to hex via .toString(16).
10603
+ */
10604
+ color?: number;
10605
+ /**
10606
+ * Position in role hierarchy (higher = more authority)
10607
+ */
10608
+ position?: number;
10609
+ /**
10610
+ * Permissions bitfield as a stringified integer
10611
+ */
10612
+ permissions?: string;
10613
+ /**
10614
+ * True for integration-managed roles (bot roles)
10615
+ */
10616
+ managed?: boolean;
10617
+ mentionable?: boolean;
10618
+ /**
10619
+ * True if role is displayed separately in member list
10620
+ */
10621
+ hoist?: boolean;
10622
+ }>;
10623
+ });
10624
+
10625
+ export type ListDiscordGuildRolesError = (unknown | {
10626
+ error?: string;
10627
+ });
10628
+
10629
+ export type ListDiscordGuildMembersData = {
10630
+ path: {
10631
+ guildId: string;
10632
+ };
10633
+ query: {
10634
+ accountId: string;
10635
+ /**
10636
+ * Snowflake of the last member from the previous page.
10637
+ */
10638
+ after?: string;
10639
+ /**
10640
+ * Page size (1-1000).
10641
+ */
10642
+ limit?: number;
10643
+ };
10644
+ };
10645
+
10646
+ export type ListDiscordGuildMembersResponse = ({
10647
+ data?: Array<{
10648
+ user?: {
10649
+ /**
10650
+ * User snowflake
10651
+ */
10652
+ id?: string;
10653
+ username?: string;
10654
+ discriminator?: string;
10655
+ avatar?: (string) | null;
10656
+ /**
10657
+ * User's display name (post-2023 Discord rebrand)
10658
+ */
10659
+ global_name?: (string) | null;
10660
+ };
10661
+ /**
10662
+ * Guild-specific nickname
10663
+ */
10664
+ nick?: (string) | null;
10665
+ /**
10666
+ * Snowflake IDs of roles assigned to this member
10667
+ */
10668
+ roles?: Array<(string)>;
10669
+ joined_at?: string;
10670
+ /**
10671
+ * When the user started boosting the server
10672
+ */
10673
+ premium_since?: (string) | null;
10674
+ }>;
10675
+ pagination?: {
10676
+ /**
10677
+ * Pass as `after` on the next call. Null when there are no more pages.
10678
+ */
10679
+ nextCursor?: (string) | null;
10680
+ hasMore?: boolean;
10681
+ };
10682
+ });
10683
+
10684
+ export type ListDiscordGuildMembersError = (unknown | {
10685
+ error?: string;
10686
+ });
10687
+
10688
+ export type AddDiscordMemberRoleData = {
10689
+ path: {
10690
+ guildId: string;
10691
+ roleId: string;
10692
+ /**
10693
+ * Discord user snowflake to assign the role to.
10694
+ */
10695
+ userId: string;
10696
+ };
10697
+ query: {
10698
+ accountId: string;
10699
+ };
10700
+ };
10701
+
10702
+ export type AddDiscordMemberRoleResponse = ({
10703
+ success?: boolean;
10704
+ operation?: 'role_assigned';
10705
+ guildId?: string;
10706
+ userId?: string;
10707
+ roleId?: string;
10708
+ });
10709
+
10710
+ export type AddDiscordMemberRoleError = (unknown | {
10711
+ error?: string;
10712
+ });
10713
+
10714
+ export type RemoveDiscordMemberRoleData = {
10715
+ path: {
10716
+ guildId: string;
10717
+ roleId: string;
10718
+ userId: string;
10719
+ };
10720
+ query: {
10721
+ accountId: string;
10722
+ };
10723
+ };
10724
+
10725
+ export type RemoveDiscordMemberRoleResponse = ({
10726
+ success?: boolean;
10727
+ operation?: 'role_removed';
10728
+ guildId?: string;
10729
+ userId?: string;
10730
+ roleId?: string;
10731
+ });
10732
+
10733
+ export type RemoveDiscordMemberRoleError = (unknown | {
10734
+ error?: string;
10735
+ });
10736
+
10737
+ export type ListDiscordPinnedMessagesData = {
10738
+ path: {
10739
+ /**
10740
+ * Discord channel snowflake.
10741
+ */
10742
+ channelId: string;
10743
+ };
10744
+ query: {
10745
+ /**
10746
+ * SocialAccount _id of any Discord account in the same guild.
10747
+ */
10748
+ accountId: string;
10749
+ };
10750
+ };
10751
+
10752
+ export type ListDiscordPinnedMessagesResponse = ({
10753
+ data?: Array<{
10754
+ id?: string;
10755
+ channel_id?: string;
10756
+ content?: string;
10757
+ timestamp?: string;
10758
+ author?: {
10759
+ [key: string]: unknown;
10760
+ };
10761
+ attachments?: Array<{
10762
+ [key: string]: unknown;
10763
+ }>;
10764
+ embeds?: Array<{
10765
+ [key: string]: unknown;
10766
+ }>;
10767
+ }>;
10768
+ });
10769
+
10770
+ export type ListDiscordPinnedMessagesError = (unknown | {
10771
+ error?: string;
10772
+ });
10773
+
10774
+ export type PinDiscordMessageData = {
10775
+ path: {
10776
+ channelId: string;
10777
+ messageId: string;
10778
+ };
10779
+ query: {
10780
+ accountId: string;
10781
+ };
10782
+ };
10783
+
10784
+ export type PinDiscordMessageResponse = ({
10785
+ success?: boolean;
10786
+ operation?: 'message_pinned';
10787
+ channelId?: string;
10788
+ messageId?: string;
10789
+ });
10790
+
10791
+ export type PinDiscordMessageError = (unknown | {
10792
+ error?: string;
10793
+ });
10794
+
10795
+ export type UnpinDiscordMessageData = {
10796
+ path: {
10797
+ channelId: string;
10798
+ messageId: string;
10799
+ };
10800
+ query: {
10801
+ accountId: string;
10802
+ };
10803
+ };
10804
+
10805
+ export type UnpinDiscordMessageResponse = ({
10806
+ success?: boolean;
10807
+ operation?: 'message_unpinned';
10808
+ channelId?: string;
10809
+ messageId?: string;
10810
+ });
10811
+
10812
+ export type UnpinDiscordMessageError = (unknown | {
10813
+ error?: string;
10814
+ });
10815
+
10816
+ export type ListDiscordScheduledEventsData = {
10817
+ path: {
10818
+ guildId: string;
10819
+ };
10820
+ query: {
10821
+ accountId: string;
10822
+ /**
10823
+ * Include user_count on each event.
10824
+ */
10825
+ withUserCount?: boolean;
10826
+ };
10827
+ };
10828
+
10829
+ export type ListDiscordScheduledEventsResponse = ({
10830
+ data?: Array<DiscordScheduledEvent>;
10831
+ });
10832
+
10833
+ export type ListDiscordScheduledEventsError = (unknown | {
10834
+ error?: string;
10835
+ });
10836
+
10837
+ export type CreateDiscordScheduledEventData = {
10838
+ body: {
10839
+ accountId: string;
10840
+ name: string;
10841
+ description?: string;
10842
+ /**
10843
+ * ISO 8601 start time. Must be in the future.
10844
+ */
10845
+ startsAt: string;
10846
+ entity: ({
10847
+ type: 'external';
10848
+ /**
10849
+ * Where the event takes place (e.g. "Zoom link", "123 Main St")
10850
+ */
10851
+ location: string;
10852
+ endsAt: string;
10853
+ } | {
10854
+ type: 'voice';
10855
+ /**
10856
+ * Voice channel snowflake.
10857
+ */
10858
+ channelId: string;
10859
+ endsAt?: string;
10860
+ } | {
10861
+ type: 'stage';
10862
+ /**
10863
+ * Stage channel snowflake.
10864
+ */
10865
+ channelId: string;
10866
+ endsAt?: string;
10867
+ });
10868
+ /**
10869
+ * Optional cover image as a base64 data URI.
10870
+ */
10871
+ imageDataUri?: string;
10872
+ };
10873
+ path: {
10874
+ guildId: string;
10875
+ };
10876
+ };
10877
+
10878
+ export type CreateDiscordScheduledEventResponse = ({
10879
+ data?: DiscordScheduledEvent;
10880
+ });
10881
+
10882
+ export type CreateDiscordScheduledEventError = (unknown | {
10883
+ error?: string;
10884
+ });
10885
+
10886
+ export type GetDiscordScheduledEventData = {
10887
+ path: {
10888
+ eventId: string;
10889
+ guildId: string;
10890
+ };
10891
+ query: {
10892
+ accountId: string;
10893
+ };
10894
+ };
10895
+
10896
+ export type GetDiscordScheduledEventResponse = ({
10897
+ data?: DiscordScheduledEvent;
10898
+ });
10899
+
10900
+ export type GetDiscordScheduledEventError = ({
10901
+ error?: string;
10902
+ } | unknown);
10903
+
10904
+ export type UpdateDiscordScheduledEventData = {
10905
+ body: {
10906
+ accountId: string;
10907
+ name?: string;
10908
+ description?: string;
10909
+ startsAt?: string;
10910
+ endsAt?: string;
10911
+ /**
10912
+ * For external events.
10913
+ */
10914
+ location?: string;
10915
+ /**
10916
+ * Status transition. Most common: 'cancelled' to cancel an event.
10917
+ */
10918
+ status?: 'scheduled' | 'active' | 'completed' | 'cancelled';
10919
+ imageDataUri?: string;
10920
+ };
10921
+ path: {
10922
+ eventId: string;
10923
+ guildId: string;
10924
+ };
10925
+ };
10926
+
10927
+ export type UpdateDiscordScheduledEventResponse = ({
10928
+ data?: DiscordScheduledEvent;
10929
+ });
10930
+
10931
+ export type UpdateDiscordScheduledEventError = (unknown | {
10932
+ error?: string;
10933
+ });
10934
+
10935
+ export type DeleteDiscordScheduledEventData = {
10936
+ path: {
10937
+ eventId: string;
10938
+ guildId: string;
10939
+ };
10940
+ query: {
10941
+ accountId: string;
10942
+ };
10943
+ };
10944
+
10945
+ export type DeleteDiscordScheduledEventResponse = ({
10946
+ success?: boolean;
10947
+ /**
10948
+ * The deleted event's snowflake.
10949
+ */
10950
+ deleted?: string;
10951
+ });
10952
+
10953
+ export type DeleteDiscordScheduledEventError = ({
10954
+ error?: string;
10955
+ } | unknown);
10956
+
10445
10957
  export type ListQueueSlotsData = {
10446
10958
  query: {
10447
10959
  /**
@@ -17531,6 +18043,18 @@ export type CreateStandaloneAdData = {
17531
18043
  * Required on legacy + multi-creative shapes. Inherited on attach.
17532
18044
  */
17533
18045
  budgetType?: 'daily' | 'lifetime';
18046
+ /**
18047
+ * Meta only. Where the budget lives, which selects the Meta budget model:
18048
+ * - `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the
18049
+ * ad set. This is the back-compatible behaviour — omit this field to keep it.
18050
+ * - `campaign`: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The
18051
+ * budget AND `bidStrategy` are set on the CAMPAIGN, and Meta distributes spend
18052
+ * across ad sets automatically.
18053
+ * Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore
18054
+ * this field. Ignored on the attach shape (`adSetId`), which inherits the existing budget.
18055
+ *
18056
+ */
18057
+ budgetLevel?: 'adset' | 'campaign';
17534
18058
  currency?: string;
17535
18059
  /**
17536
18060
  * Required for Meta, Google, Pinterest, and LinkedIn on legacy + attach shapes (skip for multi-creative — use `creatives[].headline`). Ignored for TikTok and X/Twitter. Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400. On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title.
@@ -17723,6 +18247,34 @@ export type CreateStandaloneAdData = {
17723
18247
  * Language codes (e.g. ['en']). Restricts the audience by language.
17724
18248
  */
17725
18249
  languages?: Array<(string)>;
18250
+ /**
18251
+ * Meta only. Manual ad placements. Omit for automatic placements (Meta's default,
18252
+ * recommended for most cases — Meta optimises delivery across all eligible surfaces).
18253
+ * When set, restricts delivery to the chosen surfaces, mapped onto the ad set's
18254
+ * `targeting.{publisher_platforms, facebook_positions, instagram_positions,
18255
+ * messenger_positions, audience_network_positions, threads_positions,
18256
+ * whatsapp_positions, device_platforms}`. Enum membership is validated here; Meta
18257
+ * additionally enforces co-selection rules (e.g. some positions require their parent
18258
+ * publisher platform) and returns an actionable error which we surface. Non-Meta
18259
+ * platforms reject this field.
18260
+ *
18261
+ */
18262
+ placements?: {
18263
+ /**
18264
+ * Top-level platforms to deliver on. A position field below is only honoured when its parent platform is included here.
18265
+ */
18266
+ publisherPlatforms?: Array<('facebook' | 'instagram' | 'threads' | 'messenger' | 'audience_network')>;
18267
+ facebookPositions?: Array<('feed' | 'right_hand_column' | 'marketplace' | 'video_feeds' | 'story' | 'search' | 'instream_video' | 'facebook_reels' | 'facebook_reels_overlay' | 'profile_feed' | 'notification')>;
18268
+ instagramPositions?: Array<('stream' | 'story' | 'explore' | 'explore_home' | 'reels' | 'profile_feed' | 'ig_search' | 'profile_reels')>;
18269
+ messengerPositions?: Array<('messenger_home' | 'sponsored_messages' | 'story')>;
18270
+ audienceNetworkPositions?: Array<('classic' | 'rewarded_video')>;
18271
+ threadsPositions?: Array<('threads_stream')>;
18272
+ whatsappPositions?: Array<('status')>;
18273
+ /**
18274
+ * Restrict by device. Omit to deliver on both mobile and desktop.
18275
+ */
18276
+ devicePlatforms?: Array<('mobile' | 'desktop')>;
18277
+ };
17726
18278
  /**
17727
18279
  * ID of a `saved_targeting` audience (created via POST /v1/ads/audiences). When set, its stored
17728
18280
  * TargetingSpec is expanded as the base targeting; inline fields on this body merge on top. Lets you
@@ -17741,6 +18293,61 @@ export type CreateStandaloneAdData = {
17741
18293
  * Required for lifetime budgets
17742
18294
  */
17743
18295
  endDate?: string;
18296
+ /**
18297
+ * Meta only. Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the
18298
+ * ad set's `start_time`. When omitted the ad starts delivering immediately. For lifetime
18299
+ * budgets Meta also requires `endDate`. (Same `schedule.startDate` semantics already
18300
+ * available on `POST /v1/ads/boost`.)
18301
+ *
18302
+ */
18303
+ startDate?: string;
18304
+ /**
18305
+ * Meta only. Override the Instagram account the ad is delivered as — pass an Instagram
18306
+ * Business Account ID (e.g. 17841...), mapped to the creative's `instagram_user_id`.
18307
+ * When omitted we auto-resolve the IG account linked to the connected Facebook Page
18308
+ * (the existing default). Useful when a Page has more than one eligible IG account.
18309
+ *
18310
+ */
18311
+ instagramAccountId?: string;
18312
+ /**
18313
+ * Meta only. Dynamic Creative: supply a POOL of assets and Meta auto-combines and
18314
+ * optimises them into the best-performing variations within a single ad (mapped to the
18315
+ * creative's `asset_feed_spec`). When set, the top-level single-creative fields
18316
+ * (`imageUrl`, `headline`, `body`, `linkUrl`, `callToAction`) are ignored. Mutually
18317
+ * exclusive with the `creatives[]` multi-creative shape. Meta limits: ≤10 images,
18318
+ * ≤5 bodies / titles / descriptions.
18319
+ *
18320
+ */
18321
+ dynamicCreative?: {
18322
+ /**
18323
+ * Pool of image URLs (1-10). Uploaded to the ad account and referenced by hash in the asset feed.
18324
+ */
18325
+ imageUrls: Array<(string)>;
18326
+ /**
18327
+ * Primary-text variations (the body copy).
18328
+ */
18329
+ bodies?: Array<(string)>;
18330
+ /**
18331
+ * Headline variations.
18332
+ */
18333
+ titles?: Array<(string)>;
18334
+ /**
18335
+ * Description (link caption) variations.
18336
+ */
18337
+ descriptions?: Array<(string)>;
18338
+ /**
18339
+ * Destination URL variations. At least one is required unless `goal` is `lead_generation`.
18340
+ */
18341
+ linkUrls?: Array<(string)>;
18342
+ /**
18343
+ * CTA-button variations. Required.
18344
+ */
18345
+ callToActionTypes?: Array<('LEARN_MORE' | 'SHOP_NOW' | 'SIGN_UP' | 'BOOK_TRAVEL' | 'CONTACT_US' | 'DOWNLOAD' | 'GET_OFFER' | 'GET_QUOTE' | 'SUBSCRIBE' | 'WATCH_MORE' | 'REGISTER' | 'JOIN' | 'ATTEND' | 'REQUEST_DEMO' | 'VIEW_QUOTE' | 'APPLY' | 'SEE_MORE' | 'BUY_NOW')>;
18346
+ /**
18347
+ * Asset-feed ad format. Defaults to SINGLE_IMAGE.
18348
+ */
18349
+ adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE';
18350
+ };
17744
18351
  /**
17745
18352
  * Custom audience ID for targeting
17746
18353
  */