@funnelchat-hq/sdk 0.1.1 → 0.2.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/dist/index.js CHANGED
@@ -315,11 +315,72 @@ var SEND_ERROR_CODES = {
315
315
  /** 422: the number cannot send forms. */
316
316
  number_not_eligible: 422
317
317
  };
318
+ var NUMBER_ERROR_CODES = {
319
+ /** 403: the plan of the account does not include numbers. */
320
+ numbers_not_included: 403,
321
+ /** 403: the account already uses every number of its plan (`limit`, `used`, `pending_device_ids` in the body). */
322
+ number_limit_reached: 403,
323
+ /** 403: the account cannot connect numbers now. */
324
+ connect_not_allowed: 403,
325
+ /** 403: `devices.qr` of a number whose payment is due. */
326
+ payment_required: 403,
327
+ /**
328
+ * 409: the account already has a QR number waiting to be scanned (at most one): its `device_id`
329
+ * comes in the body. Show that one's QR, or delete it, instead of creating another.
330
+ */
331
+ pending_number_exists: 409,
332
+ /** 422 (409 on `devices.qr`): QR can only be added to an official number that is in coexistence. */
333
+ qr_requires_coexistence: 422,
334
+ /** 422: the number already has that connection method; the body brings its `device_id`. */
335
+ method_already_present: 422,
336
+ /** 422: `same_number_as` or `device_id` is not a number of the account that can take it. */
337
+ invalid_reference_device: 422,
338
+ /** 422: a connect link with `device_id` of a number that connects another way than `type`. */
339
+ connection_type_mismatch: 422,
340
+ /** 422 (409 on `devices.qr`): the number is suspended because the plan has fewer numbers than the account uses. */
341
+ number_suspended_by_plan: 422,
342
+ /** 422: the body is not valid; `errors` says which fields. */
343
+ invalid_request: 422,
344
+ /** 409: `devices.qr` of a trial number that is blocked. */
345
+ trial_number_blocked: 409,
346
+ /** 409: `devices.qr` of a number that is turned off. */
347
+ device_inactive: 409,
348
+ /** 409: `devices.qr` when no more QR sessions can be started now. */
349
+ provisioning_quota_exceeded: 409,
350
+ /** 409: revoking a connect link that is no longer `pending`. */
351
+ link_not_pending: 409,
352
+ /** 429: the account has 20 connect links open. Revoke some, or wait for them to end. Not worth retrying. */
353
+ too_many_open_links: 429,
354
+ /** 500 (502 on `devices.qr`): the WhatsApp provider failed. */
355
+ provider_error: 500,
356
+ /** 503: official numbers (`type: 'meta'`) cannot be connected by link yet. QR links work. Not worth retrying. */
357
+ meta_connect_disabled: 503,
358
+ /** 403: the connect page was opened with an API key or a session. The page is for your customer, without credentials. */
359
+ credentials_not_allowed: 403
360
+ };
361
+ var IDEMPOTENCY_ERROR_CODES = {
362
+ /** 422: the key was already used with another body. Use a new key for a new resource. */
363
+ idempotency_key_mismatch: 422,
364
+ /** 422: the key is not 1 to 255 characters. */
365
+ invalid_idempotency_key: 422,
366
+ /** 409: the first call with that key, or another operation on the number, is still running. Read the state, or repeat it later. */
367
+ operation_in_progress: 409
368
+ };
318
369
  var has = (table, code) => code !== void 0 && Object.prototype.hasOwnProperty.call(table, code);
319
370
  function isSendRuleError(code) {
320
371
  return has(SEND_ERROR_CODES, code);
321
372
  }
322
- var NOT_RETRYABLE_CODES = /* @__PURE__ */ new Set(["mac_lockout_24h", "mac_limit_reached"]);
373
+ var QUOTA_CODES = /* @__PURE__ */ new Set([
374
+ "numbers_not_included",
375
+ "number_limit_reached",
376
+ "pending_number_exists",
377
+ "qr_requires_coexistence",
378
+ "method_already_present"
379
+ ]);
380
+ function isNumberQuotaError(code) {
381
+ return code !== void 0 && QUOTA_CODES.has(code);
382
+ }
383
+ var NOT_RETRYABLE_CODES = /* @__PURE__ */ new Set(["mac_lockout_24h", "mac_limit_reached", "too_many_open_links", "meta_connect_disabled"]);
323
384
 
324
385
  // src/generated/routes.ts
325
386
  var routes = [
@@ -372,6 +433,10 @@ var routes = [
372
433
  { "method": "GET", "path": "/api/v1/campaigns/{campaign}/pipelines/{pipeline}", "operationId": "campaign.showPipeline", "domain": "communities", "permission": "communities:read", "tag": "Grupos de una campa\xF1a y operaciones", "summary": "Ver un pipeline", "pending": false },
373
434
  { "method": "GET", "path": "/api/v1/campaigns/{campaign}/webhooks", "operationId": "campaignWebhook.index", "domain": "communities", "permission": "communities:read", "tag": "Webhooks de campa\xF1a (legado)", "summary": "Listar los webhooks de una campa\xF1a", "pending": false },
374
435
  { "method": "GET", "path": "/api/v1/campaigns/{campaign}/webhooks/logs", "operationId": "campaignWebhook.logs", "domain": "communities", "permission": "communities:read", "tag": "Webhooks de campa\xF1a (legado)", "summary": "Listar las entregas de los webhooks de una campa\xF1a", "pending": false },
436
+ { "method": "GET", "path": "/api/v1/connect-links", "operationId": "pendingConnectLink.index", "domain": "accounts", "permission": "accounts:read", "tag": "ConnectLink", "summary": "List connect links", "pending": true },
437
+ { "method": "POST", "path": "/api/v1/connect-links", "operationId": "pendingConnectLink.store", "domain": "accounts", "permission": "accounts:operate", "tag": "ConnectLink", "summary": "Create a connect link", "pending": true },
438
+ { "method": "DELETE", "path": "/api/v1/connect-links/{link}", "operationId": "pendingConnectLink.destroy", "domain": "accounts", "permission": "accounts:operate", "tag": "ConnectLink", "summary": "Revoke a connect link", "pending": true },
439
+ { "method": "GET", "path": "/api/v1/connect-links/{link}", "operationId": "pendingConnectLink.show", "domain": "accounts", "permission": "accounts:read", "tag": "ConnectLink", "summary": "Read a connect link", "pending": true },
375
440
  { "method": "PUT", "path": "/api/v1/contact-flows/{contactFlowId}/cancel", "operationId": "flow.cancelContactFlow", "domain": "conversations", "permission": "conversations:write", "tag": "Flow", "summary": "Cancelar un flujo en curso", "pending": false },
376
441
  { "method": "GET", "path": "/api/v1/contact-flows/{contactId}", "operationId": "flow.contactFlowHistory", "domain": "conversations", "permission": "conversations:read", "tag": "Flow", "summary": "Listar los flujos en curso de un contacto", "pending": false },
377
442
  { "method": "GET", "path": "/api/v1/contacts", "operationId": "contact.index", "domain": "conversations", "permission": "conversations:read", "tag": "Contact", "summary": "Listar contactos", "pending": false },
@@ -421,10 +486,11 @@ var routes = [
421
486
  { "method": "GET", "path": "/api/v1/custom-fields/{customField}", "operationId": "customField.show", "domain": "conversations", "permission": "conversations:read", "tag": "CustomField", "summary": "Ver un campo personalizado", "pending": false },
422
487
  { "method": "PUT", "path": "/api/v1/custom-fields/{customField}", "operationId": "customField.update", "domain": "conversations", "permission": "conversations:write", "tag": "CustomField", "summary": "Actualizar un campo personalizado", "pending": false },
423
488
  { "method": "POST", "path": "/api/v1/custom-fields/delete", "operationId": "customField.destroy", "domain": "conversations", "permission": "conversations:write", "tag": "CustomField", "summary": "Eliminar campos personalizados", "pending": false },
424
- { "method": "GET", "path": "/api/v1/devices", "operationId": "device.index", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Listar n\xFAmeros", "pending": false },
489
+ { "method": "GET", "path": "/api/v1/devices", "operationId": "device.index", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Listar n\xFAmeros", "pending": true },
490
+ { "method": "POST", "path": "/api/v1/devices", "operationId": "pendingDevice.store", "domain": "accounts", "permission": "accounts:operate", "tag": "Device", "summary": "Create a number connected by QR code", "pending": true },
425
491
  { "method": "DELETE", "path": "/api/v1/devices/{device}", "operationId": "device.destroy", "domain": "accounts", "permission": "accounts:operate", "tag": "Device", "summary": "Eliminar un n\xFAmero", "pending": false },
426
492
  { "method": "GET", "path": "/api/v1/devices/{device}", "operationId": "device.show", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Ver un n\xFAmero", "pending": false },
427
- { "method": "PUT", "path": "/api/v1/devices/{device}", "operationId": "device.update", "domain": "accounts", "permission": "accounts:write", "tag": "Device", "summary": "Actualizar un n\xFAmero", "pending": false },
493
+ { "method": "PUT", "path": "/api/v1/devices/{device}", "operationId": "device.update", "domain": "accounts", "permission": "accounts:write", "tag": "Device", "summary": "Actualizar un n\xFAmero", "pending": true },
428
494
  { "method": "GET", "path": "/api/v1/devices/{device}/ad-groups", "operationId": "group.adGroups", "domain": "communities", "permission": "communities:read", "tag": "Grupos", "summary": "Listar los grupos de anuncios de un n\xFAmero", "pending": false },
429
495
  { "method": "POST", "path": "/api/v1/devices/{device}/capi/dataset", "operationId": "capiConnection.dataset", "domain": "accounts", "permission": "accounts:write", "tag": "CapiConnection", "summary": "Configurar el dataset de Conversions API", "pending": false },
430
496
  { "method": "GET", "path": "/api/v1/devices/{device}/capi/test", "operationId": "capiConnection.test", "domain": "accounts", "permission": "accounts:read", "tag": "CapiConnection", "summary": "Probar la conexi\xF3n con Conversions API", "pending": false },
@@ -448,6 +514,7 @@ var routes = [
448
514
  { "method": "DELETE", "path": "/api/v1/devices/{device}/message-queue/all", "operationId": "device.clearQueue", "domain": "accounts", "permission": "accounts:operate", "tag": "Device", "summary": "Vaciar la cola de mensajes", "pending": false },
449
515
  { "method": "GET", "path": "/api/v1/devices/{device}/message-queue/count", "operationId": "device.getQueueCount", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Contar los mensajes en la cola", "pending": false },
450
516
  { "method": "GET", "path": "/api/v1/devices/{device}/open-conversations", "operationId": "device.openConversations", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Ver qu\xE9 tel\xE9fonos tienen conversaci\xF3n abierta", "pending": false },
517
+ { "method": "GET", "path": "/api/v1/devices/{device}/qr", "operationId": "pendingDevice.qr", "domain": "accounts", "permission": "accounts:operate", "tag": "Device", "summary": "The QR code to connect a number", "pending": true },
451
518
  { "method": "PUT", "path": "/api/v1/devices/{device}/reset", "operationId": "device.reset", "domain": "accounts", "permission": "accounts:operate", "tag": "Device", "summary": "Reiniciar la sesi\xF3n de un n\xFAmero", "pending": false },
452
519
  { "method": "GET", "path": "/api/v1/devices/{device}/status", "operationId": "device.status", "domain": "accounts", "permission": "accounts:read", "tag": "Device", "summary": "Ver el estado de conexi\xF3n", "pending": false },
453
520
  { "method": "DELETE", "path": "/api/v1/devices/{device}/templates/{template}", "operationId": "messageTemplate.delete", "domain": "conversations", "permission": "conversations:write", "tag": "MessageTemplate", "summary": "Eliminar una plantilla de un n\xFAmero", "pending": false },
@@ -672,6 +739,42 @@ var Resource = class {
672
739
  get client() {
673
740
  return this.#client;
674
741
  }
742
+ /** The options of a request with `idempotencyKey` turned into the `Idempotency-Key` header. */
743
+ idempotent({ idempotencyKey, ...options } = {}) {
744
+ if (idempotencyKey === void 0) return options;
745
+ return { ...options, headers: { ...options.headers, "Idempotency-Key": idempotencyKey } };
746
+ }
747
+ };
748
+
749
+ // src/resources/connect-links.ts
750
+ var ConnectLinks = class extends Resource {
751
+ /**
752
+ * `POST /api/v1/connect-links`. `url` is the page to send your customer to: it carries the token
753
+ * and comes only in this response.
754
+ *
755
+ * `provision_us_number` (a US number of the pool, always dedicated) needs `dedicated` in
756
+ * `allowed_connection_types` and does not go with `device_id`: otherwise `422 invalid_request`.
757
+ * A Meta link stays `pending` after a failure of Facebook or Meta, so your customer can try again;
758
+ * the fifth failed attempt turns it `failed`.
759
+ *
760
+ * `country` (only `qr`, not with `device_id`) is the country of the phone that will scan the QR, in
761
+ * two letters: the WhatsApp session is opened from there. The link returns it, lowercase.
762
+ */
763
+ create(body, options) {
764
+ return this.client.request("POST", "/api/v1/connect-links", { ...this.idempotent(options), body });
765
+ }
766
+ /** `GET /api/v1/connect-links/{link}`: its `status`, and `device_id` and `error_code` once it ends. */
767
+ get(link, options) {
768
+ return this.client.request("GET", "/api/v1/connect-links/{link}", { ...options, path: { link } });
769
+ }
770
+ /** `GET /api/v1/connect-links`, paginated, newest first: filter by `status` or `external_reference`. */
771
+ list(query, options) {
772
+ return this.client.paginate("/api/v1/connect-links", { ...options, query });
773
+ }
774
+ /** `DELETE /api/v1/connect-links/{link}`: revokes a `pending` link (any other is `409 link_not_pending`). */
775
+ revoke(link, options) {
776
+ return this.client.request("DELETE", "/api/v1/connect-links/{link}", { ...options, path: { link } });
777
+ }
675
778
  };
676
779
 
677
780
  // src/resources/contacts.ts
@@ -802,10 +905,30 @@ var CustomFields = class extends Resource {
802
905
  };
803
906
 
804
907
  // src/resources/devices.ts
908
+ var REQUEST_OPTION_KEYS = /* @__PURE__ */ new Set(["headers", "timeoutMs", "maxRetries", "retrySend", "signal"]);
909
+ function isRequestOptions(value) {
910
+ if (typeof value !== "object" || value === null) return false;
911
+ const keys = Object.keys(value);
912
+ return keys.length > 0 && keys.every((key) => REQUEST_OPTION_KEYS.has(key));
913
+ }
805
914
  var Devices = class extends Resource {
806
- /** `GET /api/v1/devices`. Iterate it with `for await`, or `await` it for the first page. */
807
- list(options) {
808
- return this.client.paginate("/api/v1/devices", { ...options });
915
+ list(queryOrOptions, options) {
916
+ if (options === void 0 && isRequestOptions(queryOrOptions)) return this.client.paginate("/api/v1/devices", { ...queryOrOptions });
917
+ return this.client.paginate("/api/v1/devices", { ...options, query: queryOrOptions });
918
+ }
919
+ /**
920
+ * `POST /api/v1/devices`: creates a number that connects by QR code (`connection: 'qr'`), with
921
+ * `connected: false`. Then show its QR with `qr`, or send your customer a connect link
922
+ * (`connectLinks.create`). Needs `accounts:operate`. It takes a slot of the plan, with the panel's
923
+ * rejections: `403 numbers_not_included`, `403 number_limit_reached`, `422 qr_requires_coexistence`
924
+ * and `422 method_already_present` (`same_number_as` adds QR to a number in coexistence instead).
925
+ * An account has at most one QR number waiting to be scanned: another one is `409
926
+ * pending_number_exists`, with that number's `device_id` in `error.body`. `country` (two letters,
927
+ * such as `'br'`) is the country of the phone that will scan the QR: the WhatsApp session is opened
928
+ * from there.
929
+ */
930
+ create(body, options) {
931
+ return this.client.request("POST", "/api/v1/devices", { ...this.idempotent(options), body });
809
932
  }
810
933
  /**
811
934
  * `GET /api/v1/devices/{device}`. `capabilities` says what the number can do by API: message
@@ -814,10 +937,30 @@ var Devices = class extends Resource {
814
937
  retrieve(device, options) {
815
938
  return this.client.request("GET", "/api/v1/devices/{device}", { ...options, path: { device } });
816
939
  }
817
- /** `PUT /api/v1/devices/{device}`. */
940
+ /**
941
+ * `DELETE /api/v1/devices/{device}`: deletes the number and frees its slot of the plan. An
942
+ * official number stops receiving through Funnelchat but stays registered with Meta; a QR one
943
+ * logs out. Irreversible; needs `accounts:operate`. Sends `device.deleted`.
944
+ */
945
+ delete(device, options) {
946
+ return this.client.request("DELETE", "/api/v1/devices/{device}", { ...options, path: { device } });
947
+ }
948
+ /** `PUT /api/v1/devices/{device}`: also changes `external_reference`. */
818
949
  update(device, body, options) {
819
950
  return this.client.request("PUT", "/api/v1/devices/{device}", { ...options, path: { device }, body });
820
951
  }
952
+ /**
953
+ * `GET /api/v1/devices/{device}/qr`: the QR code to scan, as a PNG data URI (`qr_code`), or `null`
954
+ * once `connected`. Ask for it every `expires_in` seconds (5 with a QR, 3 while the session starts,
955
+ * 0 once connected) and have it scanned right away: WhatsApp changes the code every few seconds and
956
+ * an old one no longer links, so show the latest and never store or forward a QR. Only for QR
957
+ * numbers (an official one is `422 provider_unsupported`); needs
958
+ * `accounts:operate`, since scanning it gives control of a WhatsApp. A number that cannot connect now
959
+ * answers `409` (`trial_number_blocked`, `number_suspended_by_plan`, `device_inactive`…).
960
+ */
961
+ qr(device, options) {
962
+ return this.client.request("GET", "/api/v1/devices/{device}/qr", { ...options, path: { device } });
963
+ }
821
964
  /** `GET /api/v1/devices/{device}/status`: connection status. */
822
965
  status(device, options) {
823
966
  return this.client.request("GET", "/api/v1/devices/{device}/status", { ...options, path: { device } });
@@ -1237,7 +1380,7 @@ var Webhooks = class extends Resource {
1237
1380
  };
1238
1381
 
1239
1382
  // src/version.ts
1240
- var VERSION = "0.1.1";
1383
+ var VERSION = "0.2.0";
1241
1384
 
1242
1385
  // src/client.ts
1243
1386
  var BASE_URLS = {
@@ -1264,6 +1407,8 @@ var Funnelchat = class {
1264
1407
  customFields;
1265
1408
  groups;
1266
1409
  devices;
1410
+ /** Single-use pages where your customer connects a WhatsApp number to your account. */
1411
+ connectLinks;
1267
1412
  /** Webhook subscriptions, plus `verify` and `constructEvent`. */
1268
1413
  webhooks;
1269
1414
  // Private fields: the key never shows up in `console.log(client)` or in JSON.
@@ -1298,6 +1443,7 @@ var Funnelchat = class {
1298
1443
  this.customFields = new CustomFields(this);
1299
1444
  this.groups = new Groups(this);
1300
1445
  this.devices = new Devices(this);
1446
+ this.connectLinks = new ConnectLinks(this);
1301
1447
  this.webhooks = new Webhooks(this);
1302
1448
  }
1303
1449
  /** What `JSON.stringify(client)` shows: the configuration, never the key. */
@@ -1449,8 +1595,10 @@ var webhookEvents = [
1449
1595
  { "type": "conversation.assigned", "domains": ["conversations"], "status": "live", "pending": false, "description": "Una conversaci\xF3n qued\xF3 asignada a una persona del equipo o a un agente de IA.\n\nSe env\xEDa cuando una conversaci\xF3n queda asignada a una persona del equipo (`assignee.type` = `human`) o a un agente de IA (`assignee.type` = `ai`), por cualquier camino. `assignee` trae el tipo y el nombre, nunca un identificador. No se env\xEDa al desasignar, ni cuando se vuelve a enviar el mismo asignado." },
1450
1596
  { "type": "conversation.closed", "domains": ["conversations"], "status": "live", "pending": false, "description": "Una conversaci\xF3n pas\xF3 a cerrada.\n\nSe env\xEDa cuando una conversaci\xF3n pasa de abierta a cerrada. No se env\xEDa si la conversaci\xF3n ya estaba cerrada ni cuando se reabre." },
1451
1597
  { "type": "daily_report.generated", "domains": ["communities"], "status": "live", "pending": true, "description": "The daily report of the account was generated (clicks, joins and leaves)." },
1452
- { "type": "device.connected", "domains": ["accounts"], "status": "live", "pending": true, "description": "One of the numbers of the account got connected: by scanning the QR code or by finishing the sign-up of a WhatsApp Cloud number." },
1453
- { "type": "device.disconnected", "domains": ["accounts"], "status": "live", "pending": true, "description": "One of the numbers of the account disconnected and can no longer send or receive." },
1598
+ { "type": "device.connected", "domains": ["accounts"], "status": "live", "pending": true, "description": "One of the numbers of the account got connected: by scanning the QR code, by finishing the sign-up of a WhatsApp Cloud number, or through a connect link." },
1599
+ { "type": "device.deleted", "domains": ["accounts"], "status": "planned", "pending": true, "description": "A number of the account was deleted: its slot of the plan is free again." },
1600
+ { "type": "device.disconnected", "domains": ["accounts"], "status": "live", "pending": true, "description": "One of the numbers of the account disconnected and can no longer send or receive: a QR session that closed or was protected from a shadow ban, an official number that failed its re-registration, or one disconnected from the panel." },
1601
+ { "type": "device.health_changed", "domains": ["accounts"], "status": "planned", "pending": true, "description": "The health of an official number changed (what Meta lets it do). Emitted only when the overall state changes." },
1454
1602
  { "type": "flow.completed", "domains": ["conversations"], "status": "live", "pending": false, "description": "Un contacto termin\xF3 un flujo de automatizaci\xF3n.\n\nSe env\xEDa una sola vez por cada ejecuci\xF3n de un flujo, cuando termina con \xE9xito. No se env\xEDa si la ejecuci\xF3n se cort\xF3, se cancel\xF3, qued\xF3 bloqueada o fall\xF3. `contact` es `null` si la ejecuci\xF3n no tiene un contacto asociado. Un flujo muy usado puede generar muchos eventos seguidos." },
1455
1603
  { "type": "flow.failed", "domains": ["conversations"], "status": "live", "pending": false, "description": "La ejecuci\xF3n de un flujo para un contacto termin\xF3 por un error.\n\nSe env\xEDa una sola vez por cada ejecuci\xF3n de un flujo que termina por un error, no porque lleg\xF3 al final. `reason` indica el motivo y toma uno de estos valores: `node_missing` (el paso a ejecutar ya no existe), `unknown_node_type` (el paso es de un tipo no reconocido), `missing_subflow` (el flujo que deb\xEDa ejecutarse dentro de otro ya no existe), `malformed_node` (el paso tiene una configuraci\xF3n da\xF1ada), `loop_detected` (la ejecuci\xF3n dio vueltas sin esperar nada) y `execution_error` (un error inesperado detuvo la ejecuci\xF3n). No se env\xEDa si la ejecuci\xF3n se cancel\xF3, qued\xF3 bloqueada o se cort\xF3 porque se edit\xF3 el flujo o se unieron contactos. `contact` es `null` si la ejecuci\xF3n no tiene un contacto asociado." },
1456
1604
  { "type": "group_action.failed", "domains": ["communities"], "status": "live", "pending": true, "description": "An action on a group of a campaign failed." },
@@ -1486,6 +1634,6 @@ var webhookEvents = [
1486
1634
  { "type": "whatsapp_form.completed", "domains": ["conversations"], "status": "live", "pending": true, "description": "A contact completed a form you sent them." }
1487
1635
  ];
1488
1636
 
1489
- export { ACCESS_ERROR_CODES, APIConnectionError, APIConnectionTimeoutError, APIError, APIPromise, APIUserAbortError, AuthenticationError, BASE_URLS, BadRequestError, ConflictError, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_MS, DEFAULT_TOLERANCE_SECONDS, Funnelchat, FunnelchatError, InternalServerError, NotFoundError, Page, PagePromise, PermissionDeniedError, REQUEST_ID_HEADER, RateLimitError, SEND_ERROR_CODES, SIGNATURE_HEADER, UnprocessableEntityError, UnsupportedMediaTypeError, VERSION, WebhookVerificationError, constructEvent, Funnelchat as default, isSendRuleError, routes, verify, webhookEvents };
1637
+ export { ACCESS_ERROR_CODES, APIConnectionError, APIConnectionTimeoutError, APIError, APIPromise, APIUserAbortError, AuthenticationError, BASE_URLS, BadRequestError, ConflictError, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_MS, DEFAULT_TOLERANCE_SECONDS, Funnelchat, FunnelchatError, IDEMPOTENCY_ERROR_CODES, InternalServerError, NUMBER_ERROR_CODES, NotFoundError, Page, PagePromise, PermissionDeniedError, REQUEST_ID_HEADER, RateLimitError, SEND_ERROR_CODES, SIGNATURE_HEADER, UnprocessableEntityError, UnsupportedMediaTypeError, VERSION, WebhookVerificationError, constructEvent, Funnelchat as default, isNumberQuotaError, isSendRuleError, routes, verify, webhookEvents };
1490
1638
  //# sourceMappingURL=index.js.map
1491
1639
  //# sourceMappingURL=index.js.map