@zernio/node 0.2.681 → 0.2.683

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
@@ -6702,6 +6702,27 @@ type TargetingSpec = {
6702
6702
  id: string;
6703
6703
  name?: string;
6704
6704
  }>;
6705
+ /**
6706
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Not interchangeable with the LinkedIn `jobTitles` URN fragments.
6707
+ */
6708
+ workPositions?: Array<{
6709
+ id: string;
6710
+ name?: string;
6711
+ }>;
6712
+ /**
6713
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer.
6714
+ */
6715
+ workEmployers?: Array<{
6716
+ id: string;
6717
+ name?: string;
6718
+ }>;
6719
+ /**
6720
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Not interchangeable with the LinkedIn `industries` URN fragments.
6721
+ */
6722
+ workIndustries?: Array<{
6723
+ id: string;
6724
+ name?: string;
6725
+ }>;
6705
6726
  /**
6706
6727
  * LinkedIn B2B only. Industry URN id fragments.
6707
6728
  */
@@ -6719,11 +6740,11 @@ type TargetingSpec = {
6719
6740
  */
6720
6741
  jobFunctions?: Array<(string)>;
6721
6742
  /**
6722
- * Platform audience IDs to include. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
6743
+ * Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (bare, urn:li:adSegment or urn:li:dmpSegment forms accepted), Google user list ids, X custom audience ids). Not supported on OpenAI (400).
6723
6744
  */
6724
6745
  audienceInclude?: Array<(string)>;
6725
6746
  /**
6726
- * Platform audience IDs to exclude. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
6747
+ * Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
6727
6748
  */
6728
6749
  audienceExclude?: Array<(string)>;
6729
6750
  };
@@ -8585,8 +8606,9 @@ type WebhookPayloadMessage = {
8585
8606
  /**
8586
8607
  * platformMessageId of the message this one is a quote-reply to.
8587
8608
  * WhatsApp (`context.id`), Instagram and Facebook Messenger
8588
- * (`reply_to.mid`). Outgoing quote-replies carry the same field on
8589
- * `message.sent`; see WebhookPayloadMessageSent.metadata.
8609
+ * (`reply_to.mid`). On outgoing messages the same field appears on
8610
+ * `message.sent`, but only on some surfaces: see
8611
+ * WebhookPayloadMessageSent.metadata.quotedMessageId.
8590
8612
  *
8591
8613
  */
8592
8614
  quotedMessageId?: string;
@@ -9134,13 +9156,27 @@ type WebhookPayloadMessageSent = {
9134
9156
  */
9135
9157
  metadata?: {
9136
9158
  /**
9137
- * platformMessageId of the message this send is a quote-reply to.
9138
- * Set when the reply was sent through Zernio with `replyTo` on the
9139
- * inbox send API (WhatsApp and Telegram), and when the operator
9140
- * replied from the native WhatsApp Business, Instagram or Messenger
9141
- * app. WhatsApp API sends carry it on the event fired from the
9142
- * delivery status, so it arrives on the same `message.sent` as any
9143
- * other WhatsApp send.
9159
+ * `platformMessageId` of the message this send is a quote-reply to.
9160
+ *
9161
+ * Present when the reply was sent through Zernio with `replyTo` on
9162
+ * the inbox send API (WhatsApp and Telegram). A WhatsApp API send
9163
+ * fires its `message.sent` off the delivery status, and the quote
9164
+ * reference is forwarded from the stored send there, so it arrives
9165
+ * on the same `message.sent` as any other WhatsApp send.
9166
+ *
9167
+ * Not delivered on Instagram echoes. Zernio forwards
9168
+ * `reply_to.mid` whenever Meta puts it on an echo, but on
9169
+ * Instagram Meta does not send it, so a reply the operator quoted
9170
+ * in the Instagram app arrives with no `quotedMessageId`.
9171
+ * Facebook Messenger rides a separate subscription
9172
+ * (`message_echoes`) and has not been measured, so treat it as
9173
+ * unverified rather than supported.
9174
+ *
9175
+ * Absent on WhatsApp Coexistence echoes. Meta omits the quote
9176
+ * context from `smb_message_echoes`, so a reply the operator sent
9177
+ * from the WhatsApp Business app arrives with no `quotedMessageId`
9178
+ * even though WhatsApp shows it as a quote-reply. Do not read the
9179
+ * absence of this field as "not a reply".
9144
9180
  *
9145
9181
  */
9146
9182
  quotedMessageId?: string;
@@ -19425,6 +19461,16 @@ type GetInboxConversationMessagesResponse = ({
19425
19461
  */
19426
19462
  sortOrderApplied?: 'asc' | 'desc';
19427
19463
  messages?: Array<{
19464
+ /**
19465
+ * The platform's own message id: the `wamid` on WhatsApp, the
19466
+ * `mid` on Instagram and Facebook Messenger. This is what
19467
+ * `metadata.quotedMessageId` points at, the value to pass as
19468
+ * `replyTo` on the platforms that support quote-replies, and the
19469
+ * `{messageId}` segment of the attachment-resolve URL. Webhooks
19470
+ * deliver the same value as `message.platformMessageId`; this
19471
+ * response has no field by that name.
19472
+ *
19473
+ */
19428
19474
  id?: string;
19429
19475
  conversationId?: string;
19430
19476
  accountId?: string;
@@ -19520,7 +19566,8 @@ type GetInboxConversationMessagesResponse = ({
19520
19566
  }>;
19521
19567
  /**
19522
19568
  * Platform-specific extras. Free-form, but commonly includes:
19523
- * `quotedMessageId` (platformMessageId this message replies to),
19569
+ * `quotedMessageId` (the `id` of the message this one replies to,
19570
+ * delivered as `message.platformMessageId` on webhooks),
19524
19571
  * `waInteractive` (a compact descriptor of WhatsApp interactive
19525
19572
  * content sent: buttons / list / cta_url / flow / location_request),
19526
19573
  * and for inbound interactive taps `interactiveType` / `interactiveId`.
@@ -20075,7 +20122,7 @@ type SendInboxMessageData = {
20075
20122
  */
20076
20123
  messageTag?: 'CONFIRMED_EVENT_UPDATE' | 'POST_PURCHASE_UPDATE' | 'ACCOUNT_UPDATE' | 'HUMAN_AGENT';
20077
20124
  /**
20078
- * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (both available in message.platformMessageId from webhooks or the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
20125
+ * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
20079
20126
  */
20080
20127
  replyTo?: string;
20081
20128
  /**
@@ -29130,6 +29177,10 @@ type ListAdsData = {
29130
29177
  * Platform ad account ID (e.g. act_123 for Meta). Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
29131
29178
  */
29132
29179
  adAccountId?: string;
29180
+ /**
29181
+ * Platform ad set ID (filter ads within an ad set, the /{adset_id}/ads read of an adset-centric dashboard).
29182
+ */
29183
+ adSetId?: string;
29133
29184
  /**
29134
29185
  * Platform campaign ID (filter ads within a campaign)
29135
29186
  */
@@ -30281,29 +30332,51 @@ type UpdateAdData = {
30281
30332
  advantage_audience?: 0 | 1;
30282
30333
  };
30283
30334
  /**
30284
- * Replace the ad's creative. Meta, TikTok, and LinkedIn.
30285
- *
30286
- * - **Meta**: requires `headline`, `body`, `callToAction`, `linkUrl`, `imageUrl`. The
30287
- * ad's existing creative is replaced via a new `/act_X/adcreatives` upload + ad
30288
- * update. The old creative is retained on the ad account for historical reporting.
30335
+ * Replace or patch the ad's creative. Meta, TikTok, and LinkedIn.
30336
+ *
30337
+ * - **Meta**: patch-style. Pass any subset — fields you omit are preserved from the
30338
+ * live creative, including media (`image_hash`/`video_id` are reused, no re-upload)
30339
+ * and `url_tags`. Sending the full set (`headline`, `body`, `callToAction`,
30340
+ * `linkUrl`, `imageUrl`) rebuilds the creative from scratch instead. Partial
30341
+ * patching reads the live `object_story_spec`, which Meta strips on SHARE /
30342
+ * page-post / dark / asset_feed creatives — those return 422 asking for the full
30343
+ * set. A `videoUrl`/`videoId` on an image creative is a type change and also
30344
+ * needs the full set. `existingCreativeId` repoints the ad at a creative from
30345
+ * GET /v1/ads/creatives and ignores every other field. Meta creatives are
30346
+ * immutable, so any change creates a new creative and repoints the ad; the old
30347
+ * creative is retained on the ad account for historical reporting.
30289
30348
  * - **TikTok**: patch-style. Pass any subset; `headline` is ignored (TikTok creatives
30290
30349
  * have no headline slot). `body` becomes the in-feed `ad_text`; `linkUrl` becomes
30291
- * `landing_page_url`; `videoUrl` triggers a fresh upload.
30350
+ * `landing_page_url`; `videoUrl` triggers a fresh upload. `description`, `videoId`
30351
+ * and `existingCreativeId` are Meta-only and return 400.
30292
30352
  * - **LinkedIn**: uploads new media (image via `imageUrl` or video via `videoUrl`),
30293
30353
  * creates a new inline media creative on the same campaign, and pauses the old
30294
30354
  * creative (best-effort). The old creative is retained for historical reporting.
30355
+ * `videoId` and `existingCreativeId` are Meta-only and return 400.
30295
30356
  *
30296
30357
  */
30297
30358
  creative?: {
30298
30359
  /**
30299
- * Meta only
30360
+ * Meta and LinkedIn (TikTok has no headline slot)
30300
30361
  */
30301
30362
  headline?: string;
30302
30363
  body?: string;
30364
+ /**
30365
+ * Link description slot (Meta `link_data.description` / `video_data.link_description`, LinkedIn creative description).
30366
+ */
30367
+ description?: string;
30303
30368
  callToAction?: string;
30304
30369
  linkUrl?: string;
30305
30370
  imageUrl?: string;
30306
30371
  videoUrl?: string;
30372
+ /**
30373
+ * Meta only. Reuse an already-uploaded ad video (from POST /v1/ads/videos or GET /v1/ads/videos) instead of re-uploading via videoUrl.
30374
+ */
30375
+ videoId?: string;
30376
+ /**
30377
+ * Meta only. Repoint the ad at an existing library creative (from GET /v1/ads/creatives); all other creative fields are ignored.
30378
+ */
30379
+ existingCreativeId?: string;
30307
30380
  };
30308
30381
  /**
30309
30382
  * Rename the ad. Now propagated to Meta (POST /{ad-id}); non-Meta platforms return 501.
@@ -32606,6 +32679,27 @@ type CreateStandaloneAdData = {
32606
32679
  id: string;
32607
32680
  name?: string;
32608
32681
  }>;
32682
+ /**
32683
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Each must include id. Rejected on other platforms (use LinkedIn's `jobTitles` there).
32684
+ */
32685
+ workPositions?: Array<{
32686
+ id: string;
32687
+ name?: string;
32688
+ }>;
32689
+ /**
32690
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer. Each must include id.
32691
+ */
32692
+ workEmployers?: Array<{
32693
+ id: string;
32694
+ name?: string;
32695
+ }>;
32696
+ /**
32697
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Each must include id. Rejected on other platforms (use LinkedIn's `industries` there).
32698
+ */
32699
+ workIndustries?: Array<{
32700
+ id: string;
32701
+ name?: string;
32702
+ }>;
32609
32703
  /**
32610
32704
  * Normalized household-income tier. Meta and TikTok express all four; Google maps only
32611
32705
  * `top_10`; rejected on LinkedIn, X, and Pinterest. On Meta, income targeting is incompatible
@@ -33923,9 +34017,9 @@ type SearchAdTargetingData = {
33923
34017
  */
33924
34018
  countryCode?: string;
33925
34019
  /**
33926
- * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
34020
+ * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options, `workPosition`/`workEmployer`/`workIndustry` resolve Meta work demographics. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
33927
34021
  */
33928
- dimension?: 'geo' | 'interest' | 'behavior' | 'income';
34022
+ dimension?: 'geo' | 'interest' | 'behavior' | 'income' | 'workPosition' | 'workEmployer' | 'workIndustry';
33929
34023
  /**
33930
34024
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
33931
34025
  */
package/dist/index.d.ts CHANGED
@@ -6702,6 +6702,27 @@ type TargetingSpec = {
6702
6702
  id: string;
6703
6703
  name?: string;
6704
6704
  }>;
6705
+ /**
6706
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Not interchangeable with the LinkedIn `jobTitles` URN fragments.
6707
+ */
6708
+ workPositions?: Array<{
6709
+ id: string;
6710
+ name?: string;
6711
+ }>;
6712
+ /**
6713
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer.
6714
+ */
6715
+ workEmployers?: Array<{
6716
+ id: string;
6717
+ name?: string;
6718
+ }>;
6719
+ /**
6720
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Not interchangeable with the LinkedIn `industries` URN fragments.
6721
+ */
6722
+ workIndustries?: Array<{
6723
+ id: string;
6724
+ name?: string;
6725
+ }>;
6705
6726
  /**
6706
6727
  * LinkedIn B2B only. Industry URN id fragments.
6707
6728
  */
@@ -6719,11 +6740,11 @@ type TargetingSpec = {
6719
6740
  */
6720
6741
  jobFunctions?: Array<(string)>;
6721
6742
  /**
6722
- * Platform audience IDs to include. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
6743
+ * Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (bare, urn:li:adSegment or urn:li:dmpSegment forms accepted), Google user list ids, X custom audience ids). Not supported on OpenAI (400).
6723
6744
  */
6724
6745
  audienceInclude?: Array<(string)>;
6725
6746
  /**
6726
- * Platform audience IDs to exclude. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
6747
+ * Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
6727
6748
  */
6728
6749
  audienceExclude?: Array<(string)>;
6729
6750
  };
@@ -8585,8 +8606,9 @@ type WebhookPayloadMessage = {
8585
8606
  /**
8586
8607
  * platformMessageId of the message this one is a quote-reply to.
8587
8608
  * WhatsApp (`context.id`), Instagram and Facebook Messenger
8588
- * (`reply_to.mid`). Outgoing quote-replies carry the same field on
8589
- * `message.sent`; see WebhookPayloadMessageSent.metadata.
8609
+ * (`reply_to.mid`). On outgoing messages the same field appears on
8610
+ * `message.sent`, but only on some surfaces: see
8611
+ * WebhookPayloadMessageSent.metadata.quotedMessageId.
8590
8612
  *
8591
8613
  */
8592
8614
  quotedMessageId?: string;
@@ -9134,13 +9156,27 @@ type WebhookPayloadMessageSent = {
9134
9156
  */
9135
9157
  metadata?: {
9136
9158
  /**
9137
- * platformMessageId of the message this send is a quote-reply to.
9138
- * Set when the reply was sent through Zernio with `replyTo` on the
9139
- * inbox send API (WhatsApp and Telegram), and when the operator
9140
- * replied from the native WhatsApp Business, Instagram or Messenger
9141
- * app. WhatsApp API sends carry it on the event fired from the
9142
- * delivery status, so it arrives on the same `message.sent` as any
9143
- * other WhatsApp send.
9159
+ * `platformMessageId` of the message this send is a quote-reply to.
9160
+ *
9161
+ * Present when the reply was sent through Zernio with `replyTo` on
9162
+ * the inbox send API (WhatsApp and Telegram). A WhatsApp API send
9163
+ * fires its `message.sent` off the delivery status, and the quote
9164
+ * reference is forwarded from the stored send there, so it arrives
9165
+ * on the same `message.sent` as any other WhatsApp send.
9166
+ *
9167
+ * Not delivered on Instagram echoes. Zernio forwards
9168
+ * `reply_to.mid` whenever Meta puts it on an echo, but on
9169
+ * Instagram Meta does not send it, so a reply the operator quoted
9170
+ * in the Instagram app arrives with no `quotedMessageId`.
9171
+ * Facebook Messenger rides a separate subscription
9172
+ * (`message_echoes`) and has not been measured, so treat it as
9173
+ * unverified rather than supported.
9174
+ *
9175
+ * Absent on WhatsApp Coexistence echoes. Meta omits the quote
9176
+ * context from `smb_message_echoes`, so a reply the operator sent
9177
+ * from the WhatsApp Business app arrives with no `quotedMessageId`
9178
+ * even though WhatsApp shows it as a quote-reply. Do not read the
9179
+ * absence of this field as "not a reply".
9144
9180
  *
9145
9181
  */
9146
9182
  quotedMessageId?: string;
@@ -19425,6 +19461,16 @@ type GetInboxConversationMessagesResponse = ({
19425
19461
  */
19426
19462
  sortOrderApplied?: 'asc' | 'desc';
19427
19463
  messages?: Array<{
19464
+ /**
19465
+ * The platform's own message id: the `wamid` on WhatsApp, the
19466
+ * `mid` on Instagram and Facebook Messenger. This is what
19467
+ * `metadata.quotedMessageId` points at, the value to pass as
19468
+ * `replyTo` on the platforms that support quote-replies, and the
19469
+ * `{messageId}` segment of the attachment-resolve URL. Webhooks
19470
+ * deliver the same value as `message.platformMessageId`; this
19471
+ * response has no field by that name.
19472
+ *
19473
+ */
19428
19474
  id?: string;
19429
19475
  conversationId?: string;
19430
19476
  accountId?: string;
@@ -19520,7 +19566,8 @@ type GetInboxConversationMessagesResponse = ({
19520
19566
  }>;
19521
19567
  /**
19522
19568
  * Platform-specific extras. Free-form, but commonly includes:
19523
- * `quotedMessageId` (platformMessageId this message replies to),
19569
+ * `quotedMessageId` (the `id` of the message this one replies to,
19570
+ * delivered as `message.platformMessageId` on webhooks),
19524
19571
  * `waInteractive` (a compact descriptor of WhatsApp interactive
19525
19572
  * content sent: buttons / list / cta_url / flow / location_request),
19526
19573
  * and for inbound interactive taps `interactiveType` / `interactiveId`.
@@ -20075,7 +20122,7 @@ type SendInboxMessageData = {
20075
20122
  */
20076
20123
  messageTag?: 'CONFIRMED_EVENT_UPDATE' | 'POST_PURCHASE_UPDATE' | 'ACCOUNT_UPDATE' | 'HUMAN_AGENT';
20077
20124
  /**
20078
- * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (both available in message.platformMessageId from webhooks or the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
20125
+ * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
20079
20126
  */
20080
20127
  replyTo?: string;
20081
20128
  /**
@@ -29130,6 +29177,10 @@ type ListAdsData = {
29130
29177
  * Platform ad account ID (e.g. act_123 for Meta). Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
29131
29178
  */
29132
29179
  adAccountId?: string;
29180
+ /**
29181
+ * Platform ad set ID (filter ads within an ad set, the /{adset_id}/ads read of an adset-centric dashboard).
29182
+ */
29183
+ adSetId?: string;
29133
29184
  /**
29134
29185
  * Platform campaign ID (filter ads within a campaign)
29135
29186
  */
@@ -30281,29 +30332,51 @@ type UpdateAdData = {
30281
30332
  advantage_audience?: 0 | 1;
30282
30333
  };
30283
30334
  /**
30284
- * Replace the ad's creative. Meta, TikTok, and LinkedIn.
30285
- *
30286
- * - **Meta**: requires `headline`, `body`, `callToAction`, `linkUrl`, `imageUrl`. The
30287
- * ad's existing creative is replaced via a new `/act_X/adcreatives` upload + ad
30288
- * update. The old creative is retained on the ad account for historical reporting.
30335
+ * Replace or patch the ad's creative. Meta, TikTok, and LinkedIn.
30336
+ *
30337
+ * - **Meta**: patch-style. Pass any subset — fields you omit are preserved from the
30338
+ * live creative, including media (`image_hash`/`video_id` are reused, no re-upload)
30339
+ * and `url_tags`. Sending the full set (`headline`, `body`, `callToAction`,
30340
+ * `linkUrl`, `imageUrl`) rebuilds the creative from scratch instead. Partial
30341
+ * patching reads the live `object_story_spec`, which Meta strips on SHARE /
30342
+ * page-post / dark / asset_feed creatives — those return 422 asking for the full
30343
+ * set. A `videoUrl`/`videoId` on an image creative is a type change and also
30344
+ * needs the full set. `existingCreativeId` repoints the ad at a creative from
30345
+ * GET /v1/ads/creatives and ignores every other field. Meta creatives are
30346
+ * immutable, so any change creates a new creative and repoints the ad; the old
30347
+ * creative is retained on the ad account for historical reporting.
30289
30348
  * - **TikTok**: patch-style. Pass any subset; `headline` is ignored (TikTok creatives
30290
30349
  * have no headline slot). `body` becomes the in-feed `ad_text`; `linkUrl` becomes
30291
- * `landing_page_url`; `videoUrl` triggers a fresh upload.
30350
+ * `landing_page_url`; `videoUrl` triggers a fresh upload. `description`, `videoId`
30351
+ * and `existingCreativeId` are Meta-only and return 400.
30292
30352
  * - **LinkedIn**: uploads new media (image via `imageUrl` or video via `videoUrl`),
30293
30353
  * creates a new inline media creative on the same campaign, and pauses the old
30294
30354
  * creative (best-effort). The old creative is retained for historical reporting.
30355
+ * `videoId` and `existingCreativeId` are Meta-only and return 400.
30295
30356
  *
30296
30357
  */
30297
30358
  creative?: {
30298
30359
  /**
30299
- * Meta only
30360
+ * Meta and LinkedIn (TikTok has no headline slot)
30300
30361
  */
30301
30362
  headline?: string;
30302
30363
  body?: string;
30364
+ /**
30365
+ * Link description slot (Meta `link_data.description` / `video_data.link_description`, LinkedIn creative description).
30366
+ */
30367
+ description?: string;
30303
30368
  callToAction?: string;
30304
30369
  linkUrl?: string;
30305
30370
  imageUrl?: string;
30306
30371
  videoUrl?: string;
30372
+ /**
30373
+ * Meta only. Reuse an already-uploaded ad video (from POST /v1/ads/videos or GET /v1/ads/videos) instead of re-uploading via videoUrl.
30374
+ */
30375
+ videoId?: string;
30376
+ /**
30377
+ * Meta only. Repoint the ad at an existing library creative (from GET /v1/ads/creatives); all other creative fields are ignored.
30378
+ */
30379
+ existingCreativeId?: string;
30307
30380
  };
30308
30381
  /**
30309
30382
  * Rename the ad. Now propagated to Meta (POST /{ad-id}); non-Meta platforms return 501.
@@ -32606,6 +32679,27 @@ type CreateStandaloneAdData = {
32606
32679
  id: string;
32607
32680
  name?: string;
32608
32681
  }>;
32682
+ /**
32683
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Each must include id. Rejected on other platforms (use LinkedIn's `jobTitles` there).
32684
+ */
32685
+ workPositions?: Array<{
32686
+ id: string;
32687
+ name?: string;
32688
+ }>;
32689
+ /**
32690
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer. Each must include id.
32691
+ */
32692
+ workEmployers?: Array<{
32693
+ id: string;
32694
+ name?: string;
32695
+ }>;
32696
+ /**
32697
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Each must include id. Rejected on other platforms (use LinkedIn's `industries` there).
32698
+ */
32699
+ workIndustries?: Array<{
32700
+ id: string;
32701
+ name?: string;
32702
+ }>;
32609
32703
  /**
32610
32704
  * Normalized household-income tier. Meta and TikTok express all four; Google maps only
32611
32705
  * `top_10`; rejected on LinkedIn, X, and Pinterest. On Meta, income targeting is incompatible
@@ -33923,9 +34017,9 @@ type SearchAdTargetingData = {
33923
34017
  */
33924
34018
  countryCode?: string;
33925
34019
  /**
33926
- * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
34020
+ * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options, `workPosition`/`workEmployer`/`workIndustry` resolve Meta work demographics. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
33927
34021
  */
33928
- dimension?: 'geo' | 'interest' | 'behavior' | 'income';
34022
+ dimension?: 'geo' | 'interest' | 'behavior' | 'income' | 'workPosition' | 'workEmployer' | 'workIndustry';
33929
34023
  /**
33930
34024
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
33931
34025
  */
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.681",
39
+ version: "0.2.683",
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.681",
8
+ version: "0.2.683",
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.681",
3
+ "version": "0.2.683",
4
4
  "description": "The official Node.js library for the Zernio API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -9072,8 +9072,13 @@ export const searchAdInterests = <ThrowOnError extends boolean = false>(options:
9072
9072
  * `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences.
9073
9073
  *
9074
9074
  * The `dimension` param selects what is searched, `geo` (locations, further scoped
9075
- * by `geoType`), `interest`, `behavior`, or `income`. Availability of each dimension
9076
- * varies by platform (e.g. behaviours are Meta/TikTok only). Results are normalized
9075
+ * by `geoType`), `interest`, `behavior`, `income`, or the Meta-only work
9076
+ * demographics `workPosition`, `workEmployer` and `workIndustry` (their ids feed
9077
+ * `TargetingSpec.workPositions`/`workEmployers`/`workIndustries`). Availability of
9078
+ * each dimension varies by platform (e.g. behaviours are Meta/TikTok only).
9079
+ * Work industries are a fixed ~30-entry Meta catalog with no server-side query,
9080
+ * so `workIndustry` matching, ranking and `limit` happen in Zernio.
9081
+ * Results are normalized
9077
9082
  * across platforms into a single shape, so the same client code consumes Meta,
9078
9083
  * TikTok, LinkedIn, X, Pinterest, and Google results.
9079
9084
  *
@@ -5566,6 +5566,27 @@ export type TargetingSpec = {
5566
5566
  id: string;
5567
5567
  name?: string;
5568
5568
  }>;
5569
+ /**
5570
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Not interchangeable with the LinkedIn `jobTitles` URN fragments.
5571
+ */
5572
+ workPositions?: Array<{
5573
+ id: string;
5574
+ name?: string;
5575
+ }>;
5576
+ /**
5577
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer.
5578
+ */
5579
+ workEmployers?: Array<{
5580
+ id: string;
5581
+ name?: string;
5582
+ }>;
5583
+ /**
5584
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Not interchangeable with the LinkedIn `industries` URN fragments.
5585
+ */
5586
+ workIndustries?: Array<{
5587
+ id: string;
5588
+ name?: string;
5589
+ }>;
5569
5590
  /**
5570
5591
  * LinkedIn B2B only. Industry URN id fragments.
5571
5592
  */
@@ -5583,11 +5604,11 @@ export type TargetingSpec = {
5583
5604
  */
5584
5605
  jobFunctions?: Array<(string)>;
5585
5606
  /**
5586
- * Platform audience IDs to include. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
5607
+ * Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (bare, urn:li:adSegment or urn:li:dmpSegment forms accepted), Google user list ids, X custom audience ids). Not supported on OpenAI (400).
5587
5608
  */
5588
5609
  audienceInclude?: Array<(string)>;
5589
5610
  /**
5590
- * Platform audience IDs to exclude. Not supported on any platform (no builder maps it): rejected with a 400 on ad create, boost, and reach estimate.
5611
+ * Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
5591
5612
  */
5592
5613
  audienceExclude?: Array<(string)>;
5593
5614
  };
@@ -7524,8 +7545,9 @@ export type WebhookPayloadMessage = {
7524
7545
  /**
7525
7546
  * platformMessageId of the message this one is a quote-reply to.
7526
7547
  * WhatsApp (`context.id`), Instagram and Facebook Messenger
7527
- * (`reply_to.mid`). Outgoing quote-replies carry the same field on
7528
- * `message.sent`; see WebhookPayloadMessageSent.metadata.
7548
+ * (`reply_to.mid`). On outgoing messages the same field appears on
7549
+ * `message.sent`, but only on some surfaces: see
7550
+ * WebhookPayloadMessageSent.metadata.quotedMessageId.
7529
7551
  *
7530
7552
  */
7531
7553
  quotedMessageId?: string;
@@ -8084,13 +8106,27 @@ export type WebhookPayloadMessageSent = {
8084
8106
  */
8085
8107
  metadata?: {
8086
8108
  /**
8087
- * platformMessageId of the message this send is a quote-reply to.
8088
- * Set when the reply was sent through Zernio with `replyTo` on the
8089
- * inbox send API (WhatsApp and Telegram), and when the operator
8090
- * replied from the native WhatsApp Business, Instagram or Messenger
8091
- * app. WhatsApp API sends carry it on the event fired from the
8092
- * delivery status, so it arrives on the same `message.sent` as any
8093
- * other WhatsApp send.
8109
+ * `platformMessageId` of the message this send is a quote-reply to.
8110
+ *
8111
+ * Present when the reply was sent through Zernio with `replyTo` on
8112
+ * the inbox send API (WhatsApp and Telegram). A WhatsApp API send
8113
+ * fires its `message.sent` off the delivery status, and the quote
8114
+ * reference is forwarded from the stored send there, so it arrives
8115
+ * on the same `message.sent` as any other WhatsApp send.
8116
+ *
8117
+ * Not delivered on Instagram echoes. Zernio forwards
8118
+ * `reply_to.mid` whenever Meta puts it on an echo, but on
8119
+ * Instagram Meta does not send it, so a reply the operator quoted
8120
+ * in the Instagram app arrives with no `quotedMessageId`.
8121
+ * Facebook Messenger rides a separate subscription
8122
+ * (`message_echoes`) and has not been measured, so treat it as
8123
+ * unverified rather than supported.
8124
+ *
8125
+ * Absent on WhatsApp Coexistence echoes. Meta omits the quote
8126
+ * context from `smb_message_echoes`, so a reply the operator sent
8127
+ * from the WhatsApp Business app arrives with no `quotedMessageId`
8128
+ * even though WhatsApp shows it as a quote-reply. Do not read the
8129
+ * absence of this field as "not a reply".
8094
8130
  *
8095
8131
  */
8096
8132
  quotedMessageId?: string;
@@ -19076,6 +19112,16 @@ export type GetInboxConversationMessagesResponse = ({
19076
19112
  */
19077
19113
  sortOrderApplied?: 'asc' | 'desc';
19078
19114
  messages?: Array<{
19115
+ /**
19116
+ * The platform's own message id: the `wamid` on WhatsApp, the
19117
+ * `mid` on Instagram and Facebook Messenger. This is what
19118
+ * `metadata.quotedMessageId` points at, the value to pass as
19119
+ * `replyTo` on the platforms that support quote-replies, and the
19120
+ * `{messageId}` segment of the attachment-resolve URL. Webhooks
19121
+ * deliver the same value as `message.platformMessageId`; this
19122
+ * response has no field by that name.
19123
+ *
19124
+ */
19079
19125
  id?: string;
19080
19126
  conversationId?: string;
19081
19127
  accountId?: string;
@@ -19171,7 +19217,8 @@ export type GetInboxConversationMessagesResponse = ({
19171
19217
  }>;
19172
19218
  /**
19173
19219
  * Platform-specific extras. Free-form, but commonly includes:
19174
- * `quotedMessageId` (platformMessageId this message replies to),
19220
+ * `quotedMessageId` (the `id` of the message this one replies to,
19221
+ * delivered as `message.platformMessageId` on webhooks),
19175
19222
  * `waInteractive` (a compact descriptor of WhatsApp interactive
19176
19223
  * content sent: buttons / list / cta_url / flow / location_request),
19177
19224
  * and for inbound interactive taps `interactiveType` / `interactiveId`.
@@ -19728,7 +19775,7 @@ export type SendInboxMessageData = {
19728
19775
  */
19729
19776
  messageTag?: 'CONFIRMED_EVENT_UPDATE' | 'POST_PURCHASE_UPDATE' | 'ACCOUNT_UPDATE' | 'HUMAN_AGENT';
19730
19777
  /**
19731
- * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (both available in message.platformMessageId from webhooks or the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
19778
+ * Platform message ID to quote-reply to. For WhatsApp, pass the wamid; for Telegram, the Telegram message ID (delivered as message.platformMessageId on webhooks, and as `id` on each entry of the list-messages endpoint). On Slack it threads the reply (thread_ts) instead of quoting. Silently ignored on platforms without send-side reply support, including Instagram and Facebook Messenger (Meta's Send API rejects reply_to on Instagram and does not expose it on Messenger).
19732
19779
  */
19733
19780
  replyTo?: string;
19734
19781
  /**
@@ -29534,6 +29581,10 @@ export type ListAdsData = {
29534
29581
  * Platform ad account ID (e.g. act_123 for Meta). Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
29535
29582
  */
29536
29583
  adAccountId?: string;
29584
+ /**
29585
+ * Platform ad set ID (filter ads within an ad set, the /{adset_id}/ads read of an adset-centric dashboard).
29586
+ */
29587
+ adSetId?: string;
29537
29588
  /**
29538
29589
  * Platform campaign ID (filter ads within a campaign)
29539
29590
  */
@@ -30748,29 +30799,51 @@ export type UpdateAdData = {
30748
30799
  advantage_audience?: 0 | 1;
30749
30800
  };
30750
30801
  /**
30751
- * Replace the ad's creative. Meta, TikTok, and LinkedIn.
30752
- *
30753
- * - **Meta**: requires `headline`, `body`, `callToAction`, `linkUrl`, `imageUrl`. The
30754
- * ad's existing creative is replaced via a new `/act_X/adcreatives` upload + ad
30755
- * update. The old creative is retained on the ad account for historical reporting.
30802
+ * Replace or patch the ad's creative. Meta, TikTok, and LinkedIn.
30803
+ *
30804
+ * - **Meta**: patch-style. Pass any subset — fields you omit are preserved from the
30805
+ * live creative, including media (`image_hash`/`video_id` are reused, no re-upload)
30806
+ * and `url_tags`. Sending the full set (`headline`, `body`, `callToAction`,
30807
+ * `linkUrl`, `imageUrl`) rebuilds the creative from scratch instead. Partial
30808
+ * patching reads the live `object_story_spec`, which Meta strips on SHARE /
30809
+ * page-post / dark / asset_feed creatives — those return 422 asking for the full
30810
+ * set. A `videoUrl`/`videoId` on an image creative is a type change and also
30811
+ * needs the full set. `existingCreativeId` repoints the ad at a creative from
30812
+ * GET /v1/ads/creatives and ignores every other field. Meta creatives are
30813
+ * immutable, so any change creates a new creative and repoints the ad; the old
30814
+ * creative is retained on the ad account for historical reporting.
30756
30815
  * - **TikTok**: patch-style. Pass any subset; `headline` is ignored (TikTok creatives
30757
30816
  * have no headline slot). `body` becomes the in-feed `ad_text`; `linkUrl` becomes
30758
- * `landing_page_url`; `videoUrl` triggers a fresh upload.
30817
+ * `landing_page_url`; `videoUrl` triggers a fresh upload. `description`, `videoId`
30818
+ * and `existingCreativeId` are Meta-only and return 400.
30759
30819
  * - **LinkedIn**: uploads new media (image via `imageUrl` or video via `videoUrl`),
30760
30820
  * creates a new inline media creative on the same campaign, and pauses the old
30761
30821
  * creative (best-effort). The old creative is retained for historical reporting.
30822
+ * `videoId` and `existingCreativeId` are Meta-only and return 400.
30762
30823
  *
30763
30824
  */
30764
30825
  creative?: {
30765
30826
  /**
30766
- * Meta only
30827
+ * Meta and LinkedIn (TikTok has no headline slot)
30767
30828
  */
30768
30829
  headline?: string;
30769
30830
  body?: string;
30831
+ /**
30832
+ * Link description slot (Meta `link_data.description` / `video_data.link_description`, LinkedIn creative description).
30833
+ */
30834
+ description?: string;
30770
30835
  callToAction?: string;
30771
30836
  linkUrl?: string;
30772
30837
  imageUrl?: string;
30773
30838
  videoUrl?: string;
30839
+ /**
30840
+ * Meta only. Reuse an already-uploaded ad video (from POST /v1/ads/videos or GET /v1/ads/videos) instead of re-uploading via videoUrl.
30841
+ */
30842
+ videoId?: string;
30843
+ /**
30844
+ * Meta only. Repoint the ad at an existing library creative (from GET /v1/ads/creatives); all other creative fields are ignored.
30845
+ */
30846
+ existingCreativeId?: string;
30774
30847
  };
30775
30848
  /**
30776
30849
  * Rename the ad. Now propagated to Meta (POST /{ad-id}); non-Meta platforms return 501.
@@ -33205,6 +33278,27 @@ export type CreateStandaloneAdData = {
33205
33278
  id: string;
33206
33279
  name?: string;
33207
33280
  }>;
33281
+ /**
33282
+ * Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Each must include id. Rejected on other platforms (use LinkedIn's `jobTitles` there).
33283
+ */
33284
+ workPositions?: Array<{
33285
+ id: string;
33286
+ name?: string;
33287
+ }>;
33288
+ /**
33289
+ * Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer. Each must include id.
33290
+ */
33291
+ workEmployers?: Array<{
33292
+ id: string;
33293
+ name?: string;
33294
+ }>;
33295
+ /**
33296
+ * Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Each must include id. Rejected on other platforms (use LinkedIn's `industries` there).
33297
+ */
33298
+ workIndustries?: Array<{
33299
+ id: string;
33300
+ name?: string;
33301
+ }>;
33208
33302
  /**
33209
33303
  * Normalized household-income tier. Meta and TikTok express all four; Google maps only
33210
33304
  * `top_10`; rejected on LinkedIn, X, and Pinterest. On Meta, income targeting is incompatible
@@ -34564,9 +34658,9 @@ export type SearchAdTargetingData = {
34564
34658
  */
34565
34659
  countryCode?: string;
34566
34660
  /**
34567
- * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
34661
+ * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options, `workPosition`/`workEmployer`/`workIndustry` resolve Meta work demographics. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
34568
34662
  */
34569
- dimension?: 'geo' | 'interest' | 'behavior' | 'income';
34663
+ dimension?: 'geo' | 'interest' | 'behavior' | 'income' | 'workPosition' | 'workEmployer' | 'workIndustry';
34570
34664
  /**
34571
34665
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
34572
34666
  */