@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
package/src/domains/Brands.js
CHANGED
|
@@ -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
|
package/src/domains/Campaigns.js
CHANGED
|
@@ -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.
|
|
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 (
|
|
109
|
-
* @property {string} [termsAndConditionsLink] - A URL linking to the terms and conditions (
|
|
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,
|
|
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
|
/**
|
package/src/domains/Messages.js
CHANGED
|
@@ -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
|
|
112
|
-
*
|
|
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
|
package/src/domains/Numbers.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/src/domains/Subgroups.js
CHANGED
|
@@ -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 {
|
package/src/domains/Webhooks.js
CHANGED
|
@@ -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).
|
|
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
|