@signalhousellc/sdk 1.4.3 → 1.5.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalhousellc/sdk",
3
- "version": "1.4.3",
3
+ "version": "1.5.0",
4
4
  "description": "Signal House SDK for use with the Signal House platform",
5
5
  "type": "module",
6
6
  "main": "src/SignalHouseSDK.js",
@@ -80,6 +80,29 @@
80
80
  * @property {string} [businessWebsite] - The customer's real website, sent to Infobip for brand verification (optional, valid URL, at most 255 characters; distinct from the top-level website / landing URL)
81
81
  */
82
82
 
83
+ /**
84
+ * @typedef {Object} BusinessVerificationDetails
85
+ * @property {string} businessName - The legal business name (required, at most 255 characters)
86
+ * @property {string} businessType - The business type (required, one of CO_OPERATIVE, CORPORATION, LIMITED_LIABILITY_CORPORATION, NON_PROFIT_CORPORATION, PARTNERSHIP)
87
+ * @property {string} industry - The business industry (required, one of AGRICULTURE, AUTOMOTIVE, BANKING, CONSTRUCTION, CONSUMER, EDUCATION, ELECTRONICS, ENGINEERING, ENERGY, FAST_MOVING_CONSUMER_GOODS, FINANCIAL, FINTECH, FOOD_AND_BEVERAGE, GOVERNMENT, HEALTHCARE, HOSPITALITY, INSURANCE, JEWELRY, LEGAL, MANUFACTURING, MEDIA, NOT_FOR_PROFIT, OIL_AND_GAS, ONLINE, PROFESSIONAL_SERVICES, RAW_MATERIALS, REAL_ESTATE, RELIGION, RETAIL, TECHNOLOGY, TELECOMMUNICATIONS, TRANSPORTATION, TRAVEL)
88
+ * @property {string} registrationType - The business registration type (required, one of EIN, CBN, NEQ, PROVINCIAL_NUMBER, CRN, VAT, ACN, ABN, BRN, SIREN, SIRET, NZBN, UST_IDNR, CIF, NIF, CNPJ, UID, OTHER)
89
+ * @property {string} registrationNumber - The business registration number, e.g. the EIN (required, at most 50 characters)
90
+ * @property {string} website - The business website (required, valid URL, at most 255 characters)
91
+ * @property {string} street - The business street address (required, at most 255 characters)
92
+ * @property {string} [street2] - The second line of the street address (optional, at most 255 characters)
93
+ * @property {string} city - The business city (required, at most 100 characters)
94
+ * @property {string} state - The business state or province (required, 2-letter code)
95
+ * @property {string} postalCode - The business postal code (required, at most 10 characters)
96
+ * @property {string} country - The business country (required, "US" or "CA")
97
+ * @property {Object} representative - The business's authorized representative (required)
98
+ * @property {string} representative.firstName - The representative's first name (required, at most 100 characters)
99
+ * @property {string} representative.lastName - The representative's last name (required, at most 100 characters)
100
+ * @property {string} representative.email - The representative's email address (required, valid email, at most 100 characters)
101
+ * @property {string} representative.phone - The representative's phone number (required, E.164 with an optional leading "+" and no spaces, parentheses or hyphens, e.g. "+17025550100")
102
+ * @property {string} representative.jobTitle - The representative's job title (required, at most 100 characters)
103
+ * @property {string} representative.jobLevel - The representative's job level (required, one of DIRECTOR, GM, VP, CEO, CFO, GENERAL_COUNSEL, OTHER)
104
+ */
105
+
83
106
  /**
84
107
  * @typedef {Object} CreateTollFreeBrandData
85
108
  * @property {string} subgroupId - The ID of the subgroup to create the brand under (required, exactly 8 characters)
@@ -140,6 +163,7 @@ export class Brands {
140
163
  * @param {number} [params.limit] - The number of items per page
141
164
  * @param {string} [params.status] - The status of the brand to filter by (PENDING_CREATION, PENDING_APPROVAL, UNVERIFIED, VERIFIED, VETTED_VERIFIED, PENDING_DELETE, DELETED)
142
165
  * @param {string} [params.registrationType] - Filter by registration type ("TEN_DLC", "TOLL_FREE", or "SHORT_CODE")
166
+ * @param {boolean} [params.currentTollFreeCarrier] - With subgroupId or groupId: when true, return only toll-free brands that a new toll-free campaign in that group can use (those on the group's current toll-free carrier)
143
167
  * @param {string} [params.search] - Staff-only (no id/subgroupId/groupId): case-insensitive substring over brandId, names, EIN, email, group, subgroup and reference ID
144
168
  * @param {string} [params.sortBy] - Staff-only: createdAt, brandId, displayName, groupId, subgroupId, status, entityType or country
145
169
  * @param {"asc"|"desc"} [params.sortOrder] - Staff-only: sort direction (default asc)
@@ -153,7 +177,7 @@ export class Brands {
153
177
  * @param {boolean} [params.excludeDeleted] - Staff-only: hide DELETED brands when no status is given
154
178
  * @param {boolean} [params.includeTotal] - Staff-only: with page and limit, return `{ data, total, page, limit, totalPages }` instead of the array
155
179
  * @param {RequestOptions} [params.options] - Additional options for the request
156
- * @returns {Promise<SdkResponse<Array<{ _id: string, brandId: string|null, status: string, registrationType: string, [key: string]: any }>|{ data: Array<Object>, total: number, page: number, limit: number, totalPages: number }>>} Brand records. For 10DLC brands in PENDING_CREATION (or rejected before carrier assignment), brandId is null — poll by _id until status advances and brandId is assigned. The staff-only list (no id/subgroupId/groupId) returns the `{ data, total, page, limit, totalPages }` envelope only when includeTotal is sent with page and limit.
180
+ * @returns {Promise<SdkResponse<Array<{ _id: string, brandId: string|null, status: string, registrationType: string, tollFree?: { isBrandReady?: boolean, maxNumbersPerCampaign?: number, maxOptInMethods?: number, requiresPrivacyPolicy?: boolean, requiresTermsAndConditions?: boolean, maxAppealReasonLength?: number, labelsSamples?: boolean, supportsMms?: boolean, usesBusinessVerification?: boolean, [key: string]: any }, [key: string]: any }>|{ data: Array<Object>, total: number, page: number, limit: number, totalPages: number }>>} Brand records. For 10DLC brands in PENDING_CREATION (or rejected before carrier assignment), brandId is null — poll by _id until status advances and brandId is assigned. Toll-free brands carry `tollFree.isBrandReady` (whether the brand can host campaigns), `tollFree.maxNumbersPerCampaign` (the most numbers one of its campaigns can hold), `tollFree.maxOptInMethods` (the most opt-in methods one of its campaigns can declare), `tollFree.requiresPrivacyPolicy` (whether its campaigns need a privacy policy URL), `tollFree.requiresTermsAndConditions` (whether its campaigns need a terms and conditions URL), `tollFree.maxAppealReasonLength` (the longest appeal reason its campaigns may give), `tollFree.labelsSamples` (whether its campaigns' sample messages each start with their use case's name), `tollFree.supportsMms` (whether its numbers can send MMS and group messages) and `tollFree.usesBusinessVerification` (whether it waits on the group's business verification). The staff-only list (no id/subgroupId/groupId) returns the `{ data, total, page, limit, totalPages }` envelope only when includeTotal is sent with page and limit.
157
181
  */
158
182
  async getBrands({
159
183
  id,
@@ -163,6 +187,7 @@ export class Brands {
163
187
  limit,
164
188
  status,
165
189
  registrationType,
190
+ currentTollFreeCarrier,
166
191
  search,
167
192
  sortBy,
168
193
  sortOrder,
@@ -185,6 +210,7 @@ export class Brands {
185
210
  limit,
186
211
  status,
187
212
  registrationType,
213
+ currentTollFreeCarrier,
188
214
  search,
189
215
  sortBy,
190
216
  sortOrder,
@@ -248,6 +274,38 @@ export class Brands {
248
274
  return this.client(`/brand/toll-free`, { method: 'POST', body: brandData, ...options });
249
275
  }
250
276
 
277
+ /**
278
+ * Get a group's business verification: whether its toll-free brands need one, its status and the submitted details.
279
+ * @async
280
+ * @roles api, admin, developer, billing, user
281
+ * @param {Object} params - The parameters for getting the business verification
282
+ * @param {string} params.groupId - The ID of the group whose business verification to get
283
+ * @param {RequestOptions} [params.options] - Additional options for the request
284
+ * @throws {Error} Throws an error if the groupId parameter is missing
285
+ * @returns {Promise<SdkResponse<{ groupId: string, required: boolean, status: string, details: BusinessVerificationDetails|null, submittedAt: string|null, reviewedAt: string|null, rejectionReason: string|null }>>} The group's business verification. `required` says whether the group's new toll-free brands need one; `status` is NOT_STARTED, SUBMITTING, IN_REVIEW, VERIFIED or NEEDS_CHANGES; `rejectionReason` says why it needs changes, or is null. When `required` is true and `status` is NOT_STARTED, submit it before creating the group's first toll-free brand.
286
+ */
287
+ async getBusinessVerification({ groupId, options = {} }) {
288
+ this.client._require({ groupId });
289
+ return this.client(`/brand/business-verification/${encodeURIComponent(groupId)}`, { method: 'GET', ...options });
290
+ }
291
+
292
+ /**
293
+ * Submit or update a group's business verification. Allowed when it is not started or needs changes. Review usually
294
+ * takes 1–2 business days; the group's toll-free brands stay pending until it is verified.
295
+ * @async
296
+ * @roles api, admin, developer, billing, user
297
+ * @param {Object} params - The parameters for submitting the business verification
298
+ * @param {string} params.groupId - The ID of the group whose business verification to submit (must be the caller's active group)
299
+ * @param {BusinessVerificationDetails} params.details - The business verification details (see BusinessVerificationDetails typedef for details)
300
+ * @param {RequestOptions} [params.options] - Additional options for the request
301
+ * @throws {Error} Throws an error if the groupId or details parameter is missing
302
+ * @returns {Promise<SdkResponse<{ groupId: string, required: boolean, status: string, details: BusinessVerificationDetails|null, submittedAt: string|null, reviewedAt: string|null, rejectionReason: string|null }>>} A 202 with the group's business verification, now SUBMITTING (the same shape as getBusinessVerification).
303
+ */
304
+ async submitBusinessVerification({ groupId, details, options = {} }) {
305
+ this.client._require({ groupId, details });
306
+ return this.client(`/brand/business-verification/${encodeURIComponent(groupId)}`, { method: 'PUT', body: details, ...options });
307
+ }
308
+
251
309
  /**
252
310
  * Create a local Short Code brand for manual Signal House review.
253
311
  * @async
@@ -96,7 +96,7 @@
96
96
  * @property {TollFreeOptIn} [optIns.keyword] - Keyword opt-in details
97
97
  * @property {TollFreeOptIn} [optIns.interactiveVoiceResponse] - IVR opt-in details
98
98
  * @property {string} [multiNumberReason] - Internally-stored reason the customer requested more than one Toll-Free number on the campaign (optional, at most 500 characters). Required when more than one phone number is assigned; captured for Signal House review only and never sent to the carrier.
99
- * @property {string[]} [useCases] - The sender's real use-case picks (optional). `useCase` above carries the single value the carrier accepts (MIXED when there is more than one); these are what a Signal House landing page renders a consent checkbox per. Never forwarded to the carrier.
99
+ * @property {string[]} [useCases] - The sender's real use-case picks (optional). `useCase` above carries the single value the carrier accepts (MIXED when there is more than one); these are what a Signal House landing page renders a consent checkbox per. Carriers that need specific use cases rather than MIXED take them from here when present; other carriers never receive them.
100
100
  * @property {string[]} [channels] - The channels consent covers ("SMS", "MMS", "VOICE") (optional). Never forwarded to the carrier.
101
101
  * @property {string} [landingId] - The Signal House landing page whose consent boxes this campaign's call-to-action describes (optional). Must be an ACTIVE page owned by the same brand and group.
102
102
  */
@@ -105,11 +105,11 @@
105
105
  * @typedef {Object} CreateTollFreeCampaignData
106
106
  * @property {string} brandId - The ID of the Toll-Free brand associated with the campaign (required, at least 7 characters)
107
107
  * @property {TollFreeCampaignDetails} tollFree - The Toll-Free campaign details (required)
108
- * @property {string} [privacyPolicyLink] - A URL linking to the privacy policy (optional, at most 2048 characters)
109
- * @property {string} [termsAndConditionsLink] - A URL linking to the terms and conditions (optional, at most 2048 characters)
108
+ * @property {string} [privacyPolicyLink] - A URL linking to the privacy policy (at most 2048 characters). Required when the brand's `tollFree.requiresPrivacyPolicy` is true and the brand has no `privacyPolicyLink` of its own; optional otherwise.
109
+ * @property {string} [termsAndConditionsLink] - A URL linking to the terms and conditions (at most 2048 characters). Required when the brand's `tollFree.requiresTermsAndConditions` is true and the brand has no `termsAndConditionsLink` of its own; optional otherwise.
110
110
  * @property {string} [tag] - A tag for the campaign (optional, at most 255 characters)
111
111
  * @property {boolean} [autoRenewal=true] - Whether the campaign should auto-renew (optional, defaults to true)
112
- * @property {Array<string>} phoneNumbers - The Toll-Free numbers to assign to the campaign (required, at least 1 and at most 5, each at least 10 digits and digits only). Numbers are locked to the campaign once assigned and cannot be moved or added afterward.
112
+ * @property {Array<string>} phoneNumbers - The Toll-Free numbers to assign to the campaign (required, 1 up to the brand's tollFree.maxNumbersPerCampaign and at most 5, each at least 10 digits and digits only). The numbers must be on the brand's toll-free carrier, or the campaign is refused. Numbers are locked to the campaign once assigned and cannot be moved or added afterward.
113
113
  */
114
114
 
115
115
  /**
@@ -108,8 +108,10 @@ export class Messages {
108
108
 
109
109
  /**
110
110
  * Fetch the latest upstream carrier delivery report for a set of messages by ID (SHGHL-1856).
111
- * Useful for reconciling messages stuck in a non-terminal state. SMS and MMS messages are looked up
112
- * against the carrier; other message types are returned with their stored status.
111
+ * Useful for reconciling messages stuck in a non-terminal state. Outbound SMS and MMS messages sent from numbers on
112
+ * the carrier whose delivery logs we read are looked up there (the logs are kept about 48 hours); every other message,
113
+ * including P2P messages and messages sent from numbers on other carriers, is returned with its stored status and
114
+ * upstreamReportAvailable false. The request fails with a 500 when the sending numbers can't be read.
113
115
  * @async
114
116
  * @roles api, admin, developer, billing, user
115
117
  * @param {Object} params - The parameters for fetching delivery reports
@@ -81,6 +81,7 @@ export class Numbers {
81
81
  * @param {string} [params.brandId] - Filter by brand ID
82
82
  * @param {string} [params.subgroupId] - Filter by subgroup ID
83
83
  * @param {string} [params.groupId] - Filter by group ID
84
+ * @param {boolean} [params.currentTollFreeCarrier] - With subgroupId or groupId: when true, return only toll-free numbers that a new toll-free campaign in that group can use (those on the group's current toll-free carrier)
84
85
  * @param {number} [params.page] - The page number for pagination (default: 1)
85
86
  * @param {number} [params.limit] - The number of items per page for pagination (default: 20)
86
87
  * @param {RequestOptions} [params.options] - Additional options for the request
@@ -103,8 +104,8 @@ export class Numbers {
103
104
  * or GET /campaign/health.
104
105
  * @returns {Promise<SdkResponse<any>>} A promise that resolves to the list of phone numbers
105
106
  */
106
- async getPhoneNumbers({ phoneNumber, campaignId, registrationId, brandId, subgroupId, groupId, page, limit, options = {} }) {
107
- const filters = { phoneNumber, campaignId, registrationId, brandId, subgroupId, groupId, page, limit };
107
+ async getPhoneNumbers({ phoneNumber, campaignId, registrationId, brandId, subgroupId, groupId, currentTollFreeCarrier, page, limit, options = {} }) {
108
+ const filters = { phoneNumber, campaignId, registrationId, brandId, subgroupId, groupId, currentTollFreeCarrier, page, limit };
108
109
  const queryString = this.client._getQueryString(filters);
109
110
  return this.client(`/number${queryString}`, { method: 'GET', ...options });
110
111
  }
@@ -261,14 +262,18 @@ export class Numbers {
261
262
  * @roles api, admin, developer, billing, user
262
263
  * @param {Object} params - The parameters for reading the order status
263
264
  * @param {string} params.orderId - The order id returned by `purchaseTollFreeNumbers`
265
+ * @param {string} [params.groupId] - Staff and service callers only: the order's group, whose carrier the read follows.
266
+ * Their tokens carry no active group; every other caller's order is read by its active group, so a well-formed
267
+ * groupId is ignored and a malformed one gets a 400.
264
268
  * @param {RequestOptions} [params.options] - Additional options for the request
265
269
  * @throws {Error} Throws an error if the orderId parameter is missing
266
270
  * @returns {Promise<SdkResponse<any>>} A promise that resolves to `{ orderId, counts: { ready, provisioning, failed }, failures: [{ reason }], numbers: string[] }`.
267
271
  */
268
- async getTollFreeOrderStatus({ orderId, options = {} }) {
272
+ async getTollFreeOrderStatus({ orderId, groupId, options = {} }) {
269
273
  this.client._require({ orderId });
270
274
  const safeOrderId = encodeURIComponent(orderId);
271
- return this.client(`/number/toll-free/order/${safeOrderId}`, { method: 'GET', ...options });
275
+ const queryString = this.client._getQueryString({ groupId });
276
+ return this.client(`/number/toll-free/order/${safeOrderId}${queryString}`, { method: 'GET', ...options });
272
277
  }
273
278
 
274
279
  /**
@@ -298,6 +303,60 @@ export class Numbers {
298
303
  });
299
304
  }
300
305
 
306
+ /**
307
+ * Get a phone number's outbound caller name (CNAM) - the name US carriers show for calls from it
308
+ * @async
309
+ * @roles api, admin, developer, billing, user
310
+ * @param {Object} params - The parameters for the request
311
+ * @param {string} params.phoneNumber - The phone number (E.164, leading + optional)
312
+ * @param {RequestOptions} [params.options] - Additional options for the request
313
+ * @throws {Error} Throws an error if the phoneNumber parameter is missing
314
+ * @returns {Promise<SdkResponse<any>>} A promise that resolves to `{ phoneNumber, cnam, autoApply, eligible, ineligibleReason }`
315
+ */
316
+ async getCallerName({ phoneNumber, options = {} }) {
317
+ this.client._require({ phoneNumber });
318
+ const safePhoneNumber = encodeURIComponent(phoneNumber);
319
+ return this.client(`/number/${safePhoneNumber}/cnam`, { method: 'GET', ...options });
320
+ }
321
+
322
+ /**
323
+ * Set a phone number's outbound caller name (CNAM). The name may only remove characters from the
324
+ * registered name of the number's brand (its campaign's brand, else `brandId`, else the subgroup's
325
+ * default caller-ID brand), and must be 1-15 letters, digits, spaces, `-` or `_`.
326
+ * @async
327
+ * @roles api, admin, developer
328
+ * @param {Object} params - The parameters for the request
329
+ * @param {string} params.phoneNumber - The phone number (E.164, leading + optional)
330
+ * @param {string} params.name - The caller name to show
331
+ * @param {string} [params.brandId] - The verified brand the name comes from; only for numbers with no campaign
332
+ * @param {RequestOptions} [params.options] - Additional options for the request
333
+ * @throws {Error} Throws an error if the phoneNumber or name parameter is missing
334
+ * @returns {Promise<SdkResponse<any>>} A promise that resolves to `{ phoneNumber, cnam, autoApply, eligible, ineligibleReason }`
335
+ */
336
+ async setCallerName({ phoneNumber, name, brandId, options = {} }) {
337
+ this.client._require({ phoneNumber, name });
338
+ const safePhoneNumber = encodeURIComponent(phoneNumber);
339
+ const body = brandId ? { name, brandId } : { name };
340
+ return this.client(`/number/${safePhoneNumber}/cnam`, { method: 'PUT', body, ...options });
341
+ }
342
+
343
+ /**
344
+ * Remove a phone number's own caller name (CNAM). If its subgroup has caller name auto-apply on, the
345
+ * number goes back to the automatic name.
346
+ * @async
347
+ * @roles api, admin, developer
348
+ * @param {Object} params - The parameters for the request
349
+ * @param {string} params.phoneNumber - The phone number (E.164, leading + optional)
350
+ * @param {RequestOptions} [params.options] - Additional options for the request
351
+ * @throws {Error} Throws an error if the phoneNumber parameter is missing
352
+ * @returns {Promise<SdkResponse<any>>} A promise that resolves to `{ phoneNumber, cnam, autoApply, eligible, ineligibleReason }`
353
+ */
354
+ async deleteCallerName({ phoneNumber, options = {} }) {
355
+ this.client._require({ phoneNumber });
356
+ const safePhoneNumber = encodeURIComponent(phoneNumber);
357
+ return this.client(`/number/${safePhoneNumber}/cnam`, { method: 'DELETE', ...options });
358
+ }
359
+
301
360
  /**
302
361
  * Submit a port-in request for one or more phone numbers from another provider
303
362
  * @async
@@ -371,7 +430,9 @@ export class Numbers {
371
430
  * Numbers that are not found, already RELEASED, currently being released (transient PENDING_RELEASE
372
431
  * status), already assigned to a different campaign, on a mismatched DCA, or (for a 10DLC campaign
373
432
  * without a number pool) beyond the remaining 49-number-per-campaign limit are not queued - each is
374
- * reported back individually in `skipped` instead of failing the whole request.
433
+ * reported back individually in `skipped` instead of failing the whole request. A Toll-Free campaign
434
+ * whose brand reports `tollFree.maxNumbersPerCampaign` as 1 holds one number: a request that would give
435
+ * it a second is refused with a 400 and nothing is queued.
375
436
  * @async
376
437
  * @roles api, admin, developer, billing, user
377
438
  * @param {Object} params - The parameters for assigning phone numbers to a campaign
@@ -40,6 +40,24 @@ export class Onboarding {
40
40
  return this.client(`/group/onboarding/${safeGroupId}`, { method: "GET", ...options });
41
41
  },
42
42
 
43
+ /**
44
+ * Set where a group's new toll-free brands and numbers go (`infobip` or `twilio`). Staff-only. Existing brands,
45
+ * numbers and campaigns stay where they are.
46
+ * @async
47
+ * @roles signalhouse
48
+ * @param {Object} params
49
+ * @param {string} params.groupId - The group ID whose toll-free provider to set
50
+ * @param {string} params.tollFreeProvider - The toll-free provider for the group's new toll-free brands and numbers ("infobip" or "twilio")
51
+ * @param {RequestOptions} [params.options] - Additional options for the request
52
+ * @throws {Error} Throws an error if the groupId or tollFreeProvider parameter is missing
53
+ * @returns {Promise<SdkResponse<any>>} - The updated onboarding record
54
+ */
55
+ setTollFreeProvider: async ({ groupId, tollFreeProvider, options = {} }) => {
56
+ this.client._require({ groupId, tollFreeProvider });
57
+ const safeGroupId = encodeURIComponent(groupId);
58
+ return this.client(`/group/onboarding/${safeGroupId}/toll-free-provider`, { method: "PUT", body: { tollFreeProvider }, ...options });
59
+ },
60
+
43
61
  /**
44
62
  * Add an internal comment/note to a group's admin Pricing editor. Staff-only.
45
63
  * @async
@@ -40,6 +40,8 @@
40
40
  * @property {string} [status] - The status of the subgroup (e.g., "active", "inactive")
41
41
  * @property {string} [carrierIdFamily] - Optional agency-managed carrier ID selection ("Default", "ATT", "TMobile", "Verizon", "USCellular", "GoogleVoice", "ClearSky", "Interop"). Setting this field requires signalhouse_api, signalhouse_admin, signalhouse_user, api, admin, developer, or billing role.
42
42
  * @property {string|null} [carrierIdRegion] - Optional ClearSky region ("PRClaro", "GuamDocomo", "GuamGTA", "GuamITE") or null; only valid when carrierIdFamily is "ClearSky". Setting this field requires signalhouse_api, signalhouse_admin, signalhouse_user, api, admin, developer, or billing role.
43
+ * @property {boolean} [cnamAutoApply] - Turn caller name (CNAM) auto-apply on or off: eligible numbers get their brand's registered name as the name shown on outbound calls. Requires signalhouse_api, signalhouse_admin, signalhouse_user, api, admin or developer role.
44
+ * @property {string|null} [cnamBrandId] - Default caller-ID brand for numbers with no campaign (e.g. voice-only). Must be a verified brand in this subgroup; required when turning auto-apply on in a subgroup with more than one verified brand.
43
45
  */
44
46
 
45
47
  export class Subgroups {
@@ -43,6 +43,10 @@ export class Webhooks {
43
43
  * `verifyWebhookSignature` from `@signalhousellc/sdk/webhooks` (Node only). `webhookData.authType` is one of
44
44
  * `NONE` (default), `BASIC`, `API_KEY`, `OAUTH2` or `HMAC`; `HMAC` (SHGHL-3595) sends no credentials, so the
45
45
  * receiver authenticates by the signature alone, and must be sent without `credentials` or `apiHeaderPrefix`.
46
+ * `webhookData.eventSettings` (SHGHL-3884) holds per-event options keyed by event name:
47
+ * `NUMBER_HEALTH_BELOW_THRESHOLD` and `CAMPAIGN_HEALTH_BELOW_THRESHOLD` each take `{ threshold }`, the 7-day
48
+ * health score (1.5–10, in 0.5 steps) below which the event fires; a subscribed health event without one is
49
+ * stored with the default, 6.
46
50
  * @async
47
51
  * @roles api, admin, developer
48
52
  * @param {Object} params - The parameters for creating a webhook
@@ -62,7 +66,9 @@ export class Webhooks {
62
66
  * to change the endpoint's own credentials in place: credentials are required when switching to an auth
63
67
  * type that needs them, and omitted credentials keep the stored ones. Switching to `NONE` or `HMAC` clears
64
68
  * the stored credentials; `HMAC` is rejected for an endpoint with no signing secret (call
65
- * `rotateWebhookSecret` first). Like every read of a webhook, the
69
+ * `rotateWebhookSecret` first). `updateData.eventSettings` changes per-event options by event name
70
+ * (`{ NUMBER_HEALTH_BELOW_THRESHOLD: { threshold } }`, `{ CAMPAIGN_HEALTH_BELOW_THRESHOLD: { threshold } }`,
71
+ * 1.5–10 in 0.5 steps); events you omit keep their stored settings. Like every read of a webhook, the
66
72
  * response carries `hasSigningSecret` and `hasCredentials` (booleans), never a secret or credential.
67
73
  * @async
68
74
  * @roles api, admin, developer