@zernio/node 0.2.130 → 0.2.132

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
@@ -845,6 +845,26 @@ type Ad = {
845
845
  * Meta creative object_type (e.g. SHARE, VIDEO, PRIVACY_CHECK_FAIL, POST_DELETED). Use this to render state-aware previews — when Meta moderation strips image/video fields, only thumbnailUrl at 64x64 is available.
846
846
  */
847
847
  objectType?: string;
848
+ /**
849
+ * Meta creative `object_story_id` (the SHARE reference). Frequently absent — Meta omits it for SHARE creatives. Use effectiveObjectStoryId instead.
850
+ */
851
+ objectStoryId?: (string) | null;
852
+ /**
853
+ * Meta `effective_object_story_id` — `{pageId}_{postId}` of the Facebook post the ad's engagement (comments) lives on. Pass to GET /v1/ads?effectiveObjectStoryId= to map a Business-Manager-visible post back to this ad; GET /v1/ads/{adId}/comments resolves comments against it.
854
+ */
855
+ effectiveObjectStoryId?: (string) | null;
856
+ /**
857
+ * Meta `effective_instagram_media_id` — the Instagram media ID of the boosted post the ad's engagement lives on. Pass to GET /v1/ads?effectiveInstagramMediaId= to map a Business-Manager-visible IG post back to this ad.
858
+ */
859
+ effectiveInstagramMediaId?: (string) | null;
860
+ /**
861
+ * Meta `instagram_user_id` — the Instagram-scoped business ID that owns the boosted media.
862
+ */
863
+ instagramUserId?: (string) | null;
864
+ /**
865
+ * Meta `instagram_permalink_url` — public Instagram post URL of the boosted media.
866
+ */
867
+ instagramPermalinkUrl?: (string) | null;
848
868
  /**
849
869
  * All media URLs for this ad (carousel images, multiple assets). Populated for Meta (carousel child_attachments), Google Ads (responsive display marketing_images), and LinkedIn (multi-image posts).
850
870
  */
@@ -10391,9 +10411,9 @@ type ListInboxCommentsData = {
10391
10411
  */
10392
10412
  minComments?: number;
10393
10413
  /**
10394
- * Filter by platform
10414
+ * Filter by platform. `metaads` is a synthetic value meaning the user's ads (boosted/dark posts) only; `facebook`/`instagram` return organic posts only.
10395
10415
  */
10396
- platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit';
10416
+ platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit' | 'metaads';
10397
10417
  /**
10398
10418
  * Filter by profile ID
10399
10419
  */
@@ -10432,6 +10452,14 @@ type ListInboxCommentsResponse = ({
10432
10452
  * Reddit subreddit name
10433
10453
  */
10434
10454
  subreddit?: (string) | null;
10455
+ /**
10456
+ * True when this row is an ad (boosted/dark post). `platform` is then the comment platform (facebook or instagram), `id` equals `adId`, and the thread is at GET /v1/ads/{adId}/comments.
10457
+ */
10458
+ isAd?: boolean;
10459
+ /**
10460
+ * Internal Zernio ad id — only on ad rows (same value as `id`).
10461
+ */
10462
+ adId?: string;
10435
10463
  }>;
10436
10464
  pagination?: {
10437
10465
  hasMore?: boolean;
@@ -10569,11 +10597,24 @@ type GetInboxPostCommentsResponse = ({
10569
10597
  */
10570
10598
  subreddit?: (string) | null;
10571
10599
  lastUpdated?: string;
10600
+ /**
10601
+ * (Facebook/Instagram only) Present when this post has no organic comments but is a boosted post — the engagement lives on the ad. Use the ad-comments endpoint instead.
10602
+ */
10603
+ adComments?: {
10604
+ /**
10605
+ * Internal Zernio ad ID
10606
+ */
10607
+ adId?: string;
10608
+ /**
10609
+ * Path to fetch the ad's comments (GET /v1/ads/{adId}/comments)
10610
+ */
10611
+ adCommentsUrl?: string;
10612
+ } | null;
10572
10613
  };
10573
10614
  });
10574
- type GetInboxPostCommentsError = ({
10615
+ type GetInboxPostCommentsError = (unknown | {
10575
10616
  error?: string;
10576
- } | unknown);
10617
+ });
10577
10618
  type ReplyToInboxPostData = {
10578
10619
  body: {
10579
10620
  accountId: string;
@@ -13279,6 +13320,14 @@ type ListAdsData = {
13279
13320
  * Platform campaign ID (filter ads within a campaign)
13280
13321
  */
13281
13322
  campaignId?: string;
13323
+ /**
13324
+ * Instagram media ID of the boosted post (Meta `effective_instagram_media_id`). Use to map a Business-Manager-visible IG post back to the Zernio ad.
13325
+ */
13326
+ effectiveInstagramMediaId?: string;
13327
+ /**
13328
+ * Facebook `{pageId}_{postId}` of the post the ad's engagement lives on (Meta `effective_object_story_id`). Use to map a Business-Manager-visible post back to the Zernio ad.
13329
+ */
13330
+ effectiveObjectStoryId?: string;
13282
13331
  /**
13283
13332
  * Start of metrics date range (YYYY-MM-DD). Defaults to 90 days ago.
13284
13333
  */
@@ -13289,6 +13338,10 @@ type ListAdsData = {
13289
13338
  */
13290
13339
  page?: number;
13291
13340
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter';
13341
+ /**
13342
+ * Meta ad ID. Returns the ad with this platform-side ad ID.
13343
+ */
13344
+ platformAdId?: string;
13292
13345
  /**
13293
13346
  * Profile ID
13294
13347
  */
@@ -13791,6 +13844,18 @@ type GetAdCommentsResponse = ({
13791
13844
  * Underlying post ID the comments belong to. effective_object_story_id for Facebook, effective_instagram_media_id for Instagram.
13792
13845
  */
13793
13846
  effectiveStoryId: string;
13847
+ /**
13848
+ * Instagram-only. The Instagram-scoped business ID that owns the boosted media (creative.instagram_user_id).
13849
+ */
13850
+ instagramUserId?: string;
13851
+ /**
13852
+ * Instagram-only. Public permalink of the boosted IG post (creative.instagram_permalink_url).
13853
+ */
13854
+ instagramPermalink?: string;
13855
+ /**
13856
+ * Instagram-only. The connected Instagram SocialAccount these comments were read through — use it for reply/hide actions via /v1/inbox/comments.
13857
+ */
13858
+ instagramAccountId?: string;
13794
13859
  /**
13795
13860
  * Social account ID (ads SocialAccount).
13796
13861
  */
package/dist/index.d.ts CHANGED
@@ -845,6 +845,26 @@ type Ad = {
845
845
  * Meta creative object_type (e.g. SHARE, VIDEO, PRIVACY_CHECK_FAIL, POST_DELETED). Use this to render state-aware previews — when Meta moderation strips image/video fields, only thumbnailUrl at 64x64 is available.
846
846
  */
847
847
  objectType?: string;
848
+ /**
849
+ * Meta creative `object_story_id` (the SHARE reference). Frequently absent — Meta omits it for SHARE creatives. Use effectiveObjectStoryId instead.
850
+ */
851
+ objectStoryId?: (string) | null;
852
+ /**
853
+ * Meta `effective_object_story_id` — `{pageId}_{postId}` of the Facebook post the ad's engagement (comments) lives on. Pass to GET /v1/ads?effectiveObjectStoryId= to map a Business-Manager-visible post back to this ad; GET /v1/ads/{adId}/comments resolves comments against it.
854
+ */
855
+ effectiveObjectStoryId?: (string) | null;
856
+ /**
857
+ * Meta `effective_instagram_media_id` — the Instagram media ID of the boosted post the ad's engagement lives on. Pass to GET /v1/ads?effectiveInstagramMediaId= to map a Business-Manager-visible IG post back to this ad.
858
+ */
859
+ effectiveInstagramMediaId?: (string) | null;
860
+ /**
861
+ * Meta `instagram_user_id` — the Instagram-scoped business ID that owns the boosted media.
862
+ */
863
+ instagramUserId?: (string) | null;
864
+ /**
865
+ * Meta `instagram_permalink_url` — public Instagram post URL of the boosted media.
866
+ */
867
+ instagramPermalinkUrl?: (string) | null;
848
868
  /**
849
869
  * All media URLs for this ad (carousel images, multiple assets). Populated for Meta (carousel child_attachments), Google Ads (responsive display marketing_images), and LinkedIn (multi-image posts).
850
870
  */
@@ -10391,9 +10411,9 @@ type ListInboxCommentsData = {
10391
10411
  */
10392
10412
  minComments?: number;
10393
10413
  /**
10394
- * Filter by platform
10414
+ * Filter by platform. `metaads` is a synthetic value meaning the user's ads (boosted/dark posts) only; `facebook`/`instagram` return organic posts only.
10395
10415
  */
10396
- platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit';
10416
+ platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit' | 'metaads';
10397
10417
  /**
10398
10418
  * Filter by profile ID
10399
10419
  */
@@ -10432,6 +10452,14 @@ type ListInboxCommentsResponse = ({
10432
10452
  * Reddit subreddit name
10433
10453
  */
10434
10454
  subreddit?: (string) | null;
10455
+ /**
10456
+ * True when this row is an ad (boosted/dark post). `platform` is then the comment platform (facebook or instagram), `id` equals `adId`, and the thread is at GET /v1/ads/{adId}/comments.
10457
+ */
10458
+ isAd?: boolean;
10459
+ /**
10460
+ * Internal Zernio ad id — only on ad rows (same value as `id`).
10461
+ */
10462
+ adId?: string;
10435
10463
  }>;
10436
10464
  pagination?: {
10437
10465
  hasMore?: boolean;
@@ -10569,11 +10597,24 @@ type GetInboxPostCommentsResponse = ({
10569
10597
  */
10570
10598
  subreddit?: (string) | null;
10571
10599
  lastUpdated?: string;
10600
+ /**
10601
+ * (Facebook/Instagram only) Present when this post has no organic comments but is a boosted post — the engagement lives on the ad. Use the ad-comments endpoint instead.
10602
+ */
10603
+ adComments?: {
10604
+ /**
10605
+ * Internal Zernio ad ID
10606
+ */
10607
+ adId?: string;
10608
+ /**
10609
+ * Path to fetch the ad's comments (GET /v1/ads/{adId}/comments)
10610
+ */
10611
+ adCommentsUrl?: string;
10612
+ } | null;
10572
10613
  };
10573
10614
  });
10574
- type GetInboxPostCommentsError = ({
10615
+ type GetInboxPostCommentsError = (unknown | {
10575
10616
  error?: string;
10576
- } | unknown);
10617
+ });
10577
10618
  type ReplyToInboxPostData = {
10578
10619
  body: {
10579
10620
  accountId: string;
@@ -13279,6 +13320,14 @@ type ListAdsData = {
13279
13320
  * Platform campaign ID (filter ads within a campaign)
13280
13321
  */
13281
13322
  campaignId?: string;
13323
+ /**
13324
+ * Instagram media ID of the boosted post (Meta `effective_instagram_media_id`). Use to map a Business-Manager-visible IG post back to the Zernio ad.
13325
+ */
13326
+ effectiveInstagramMediaId?: string;
13327
+ /**
13328
+ * Facebook `{pageId}_{postId}` of the post the ad's engagement lives on (Meta `effective_object_story_id`). Use to map a Business-Manager-visible post back to the Zernio ad.
13329
+ */
13330
+ effectiveObjectStoryId?: string;
13282
13331
  /**
13283
13332
  * Start of metrics date range (YYYY-MM-DD). Defaults to 90 days ago.
13284
13333
  */
@@ -13289,6 +13338,10 @@ type ListAdsData = {
13289
13338
  */
13290
13339
  page?: number;
13291
13340
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter';
13341
+ /**
13342
+ * Meta ad ID. Returns the ad with this platform-side ad ID.
13343
+ */
13344
+ platformAdId?: string;
13292
13345
  /**
13293
13346
  * Profile ID
13294
13347
  */
@@ -13791,6 +13844,18 @@ type GetAdCommentsResponse = ({
13791
13844
  * Underlying post ID the comments belong to. effective_object_story_id for Facebook, effective_instagram_media_id for Instagram.
13792
13845
  */
13793
13846
  effectiveStoryId: string;
13847
+ /**
13848
+ * Instagram-only. The Instagram-scoped business ID that owns the boosted media (creative.instagram_user_id).
13849
+ */
13850
+ instagramUserId?: string;
13851
+ /**
13852
+ * Instagram-only. Public permalink of the boosted IG post (creative.instagram_permalink_url).
13853
+ */
13854
+ instagramPermalink?: string;
13855
+ /**
13856
+ * Instagram-only. The connected Instagram SocialAccount these comments were read through — use it for reply/hide actions via /v1/inbox/comments.
13857
+ */
13858
+ instagramAccountId?: string;
13794
13859
  /**
13795
13860
  * Social account ID (ads SocialAccount).
13796
13861
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zernio/node",
3
- "version": "0.2.130",
3
+ "version": "0.2.132",
4
4
  "description": "The official Node.js library for the Zernio API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -2080,6 +2080,15 @@ export const deleteTelegramCommands = <ThrowOnError extends boolean = false>(opt
2080
2080
  /**
2081
2081
  * List commented posts
2082
2082
  * Returns posts with comment counts from all connected accounts. Aggregates data across multiple accounts.
2083
+ *
2084
+ * For users with the Ads add-on (Metronome plans always qualify), the user's Meta ads
2085
+ * (boosted/dark posts) are included too, flagged with `isAd: true` and an `adId`. Use
2086
+ * `?platform=metaads` to return *only* ad rows; passing `facebook`/`instagram` returns
2087
+ * *organic* posts only (no ads); omitting `platform` returns both. Fetch an ad row's
2088
+ * thread from GET /v1/ads/{adId}/comments. Ad comment counts are read with the Marketing
2089
+ * API token (Facebook) or the connected Instagram account's token (Instagram); an ad
2090
+ * whose count can't be read is omitted.
2091
+ *
2083
2092
  */
2084
2093
  export const listInboxComments = <ThrowOnError extends boolean = false>(options?: OptionsLegacyParser<ListInboxCommentsData, ThrowOnError>) => {
2085
2094
  return (options?.client ?? client).get<ListInboxCommentsResponse, ListInboxCommentsError, ThrowOnError>({
@@ -3237,6 +3246,12 @@ export const listCommentAutomationLogs = <ThrowOnError extends boolean = false>(
3237
3246
  * Use source=all to include externally-synced ads from platform ad managers.
3238
3247
  * If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max.
3239
3248
  *
3249
+ * To find the Zernio ad behind a comment you see in Meta Business Manager, filter by
3250
+ * platformAdId (the Meta ad ID), effectiveObjectStoryId (Facebook), or
3251
+ * effectiveInstagramMediaId (Instagram) — those are the post/media the ad's engagement
3252
+ * lives on, and are also returned on each ad's `creative` object. Then call
3253
+ * GET /v1/ads/{adId}/comments with the returned ad id.
3254
+ *
3240
3255
  */
3241
3256
  export const listAds = <ThrowOnError extends boolean = false>(options?: OptionsLegacyParser<ListAdsData, ThrowOnError>) => {
3242
3257
  return (options?.client ?? client).get<ListAdsResponse, ListAdsError, ThrowOnError>({
@@ -3474,6 +3489,11 @@ export const getAdAnalytics = <ThrowOnError extends boolean = false>(options: Op
3474
3489
  * effective_instagram_media_id (Instagram) via the Marketing API on each call
3475
3490
  * (cached in-process by the platform client), then fetches comments from the Graph API.
3476
3491
  *
3492
+ * For Instagram-placed ads, the Instagram account that runs the ad must be connected
3493
+ * to Zernio — comments are read through that account's token. If none of the connected
3494
+ * Instagram accounts on the profile can read the ad's media, the call returns
3495
+ * ads_connection_required.
3496
+ *
3477
3497
  * Meta-only. Other ad platforms (TikTok, LinkedIn, Pinterest, Google, X) do not
3478
3498
  * expose a public per-ad comments API and return feature_not_available.
3479
3499
  *
@@ -216,6 +216,26 @@ export type Ad = {
216
216
  * Meta creative object_type (e.g. SHARE, VIDEO, PRIVACY_CHECK_FAIL, POST_DELETED). Use this to render state-aware previews — when Meta moderation strips image/video fields, only thumbnailUrl at 64x64 is available.
217
217
  */
218
218
  objectType?: string;
219
+ /**
220
+ * Meta creative `object_story_id` (the SHARE reference). Frequently absent — Meta omits it for SHARE creatives. Use effectiveObjectStoryId instead.
221
+ */
222
+ objectStoryId?: (string) | null;
223
+ /**
224
+ * Meta `effective_object_story_id` — `{pageId}_{postId}` of the Facebook post the ad's engagement (comments) lives on. Pass to GET /v1/ads?effectiveObjectStoryId= to map a Business-Manager-visible post back to this ad; GET /v1/ads/{adId}/comments resolves comments against it.
225
+ */
226
+ effectiveObjectStoryId?: (string) | null;
227
+ /**
228
+ * Meta `effective_instagram_media_id` — the Instagram media ID of the boosted post the ad's engagement lives on. Pass to GET /v1/ads?effectiveInstagramMediaId= to map a Business-Manager-visible IG post back to this ad.
229
+ */
230
+ effectiveInstagramMediaId?: (string) | null;
231
+ /**
232
+ * Meta `instagram_user_id` — the Instagram-scoped business ID that owns the boosted media.
233
+ */
234
+ instagramUserId?: (string) | null;
235
+ /**
236
+ * Meta `instagram_permalink_url` — public Instagram post URL of the boosted media.
237
+ */
238
+ instagramPermalinkUrl?: (string) | null;
219
239
  /**
220
240
  * All media URLs for this ad (carousel images, multiple assets). Populated for Meta (carousel child_attachments), Google Ads (responsive display marketing_images), and LinkedIn (multi-image posts).
221
241
  */
@@ -10392,9 +10412,9 @@ export type ListInboxCommentsData = {
10392
10412
  */
10393
10413
  minComments?: number;
10394
10414
  /**
10395
- * Filter by platform
10415
+ * Filter by platform. `metaads` is a synthetic value meaning the user's ads (boosted/dark posts) only; `facebook`/`instagram` return organic posts only.
10396
10416
  */
10397
- platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit';
10417
+ platform?: 'facebook' | 'instagram' | 'twitter' | 'bluesky' | 'threads' | 'youtube' | 'linkedin' | 'reddit' | 'metaads';
10398
10418
  /**
10399
10419
  * Filter by profile ID
10400
10420
  */
@@ -10434,6 +10454,14 @@ export type ListInboxCommentsResponse = ({
10434
10454
  * Reddit subreddit name
10435
10455
  */
10436
10456
  subreddit?: (string) | null;
10457
+ /**
10458
+ * True when this row is an ad (boosted/dark post). `platform` is then the comment platform (facebook or instagram), `id` equals `adId`, and the thread is at GET /v1/ads/{adId}/comments.
10459
+ */
10460
+ isAd?: boolean;
10461
+ /**
10462
+ * Internal Zernio ad id — only on ad rows (same value as `id`).
10463
+ */
10464
+ adId?: string;
10437
10465
  }>;
10438
10466
  pagination?: {
10439
10467
  hasMore?: boolean;
@@ -10574,12 +10602,25 @@ export type GetInboxPostCommentsResponse = ({
10574
10602
  */
10575
10603
  subreddit?: (string) | null;
10576
10604
  lastUpdated?: string;
10605
+ /**
10606
+ * (Facebook/Instagram only) Present when this post has no organic comments but is a boosted post — the engagement lives on the ad. Use the ad-comments endpoint instead.
10607
+ */
10608
+ adComments?: {
10609
+ /**
10610
+ * Internal Zernio ad ID
10611
+ */
10612
+ adId?: string;
10613
+ /**
10614
+ * Path to fetch the ad's comments (GET /v1/ads/{adId}/comments)
10615
+ */
10616
+ adCommentsUrl?: string;
10617
+ } | null;
10577
10618
  };
10578
10619
  });
10579
10620
 
10580
- export type GetInboxPostCommentsError = ({
10621
+ export type GetInboxPostCommentsError = (unknown | {
10581
10622
  error?: string;
10582
- } | unknown);
10623
+ });
10583
10624
 
10584
10625
  export type ReplyToInboxPostData = {
10585
10626
  body: {
@@ -13556,6 +13597,14 @@ export type ListAdsData = {
13556
13597
  * Platform campaign ID (filter ads within a campaign)
13557
13598
  */
13558
13599
  campaignId?: string;
13600
+ /**
13601
+ * Instagram media ID of the boosted post (Meta `effective_instagram_media_id`). Use to map a Business-Manager-visible IG post back to the Zernio ad.
13602
+ */
13603
+ effectiveInstagramMediaId?: string;
13604
+ /**
13605
+ * Facebook `{pageId}_{postId}` of the post the ad's engagement lives on (Meta `effective_object_story_id`). Use to map a Business-Manager-visible post back to the Zernio ad.
13606
+ */
13607
+ effectiveObjectStoryId?: string;
13559
13608
  /**
13560
13609
  * Start of metrics date range (YYYY-MM-DD). Defaults to 90 days ago.
13561
13610
  */
@@ -13566,6 +13615,10 @@ export type ListAdsData = {
13566
13615
  */
13567
13616
  page?: number;
13568
13617
  platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter';
13618
+ /**
13619
+ * Meta ad ID. Returns the ad with this platform-side ad ID.
13620
+ */
13621
+ platformAdId?: string;
13569
13622
  /**
13570
13623
  * Profile ID
13571
13624
  */
@@ -14111,6 +14164,18 @@ export type GetAdCommentsResponse = ({
14111
14164
  * Underlying post ID the comments belong to. effective_object_story_id for Facebook, effective_instagram_media_id for Instagram.
14112
14165
  */
14113
14166
  effectiveStoryId: string;
14167
+ /**
14168
+ * Instagram-only. The Instagram-scoped business ID that owns the boosted media (creative.instagram_user_id).
14169
+ */
14170
+ instagramUserId?: string;
14171
+ /**
14172
+ * Instagram-only. Public permalink of the boosted IG post (creative.instagram_permalink_url).
14173
+ */
14174
+ instagramPermalink?: string;
14175
+ /**
14176
+ * Instagram-only. The connected Instagram SocialAccount these comments were read through — use it for reply/hide actions via /v1/inbox/comments.
14177
+ */
14178
+ instagramAccountId?: string;
14114
14179
  /**
14115
14180
  * Social account ID (ads SocialAccount).
14116
14181
  */