{"id":13764440,"url":"https://github.com/flint-bot/sparky","last_synced_at":"2025-10-22T02:57:32.877Z","repository":{"id":14829144,"uuid":"54865333","full_name":"flint-bot/sparky","owner":"flint-bot","description":"Cisco Spark API for NodeJS (deprecated in favor of https://github.com/webex/webex-bot-node-framework)","archived":false,"fork":false,"pushed_at":"2022-12-07T17:31:27.000Z","size":3896,"stargazers_count":17,"open_issues_count":16,"forks_count":12,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-04-14T13:11:13.526Z","etag":null,"topics":["cisco","spark"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flint-bot.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-28T04:27:26.000Z","updated_at":"2021-08-22T14:39:25.000Z","dependencies_parsed_at":"2023-01-11T18:54:46.882Z","dependency_job_id":null,"html_url":"https://github.com/flint-bot/sparky","commit_stats":{"total_commits":218,"total_committers":5,"mean_commits":43.6,"dds":0.02752293577981646,"last_synced_commit":"c52992920bfff20806201d78ad9c5f764211711a"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fsparky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fsparky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fsparky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fsparky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flint-bot","download_url":"https://codeload.github.com/flint-bot/sparky/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221695730,"owners_count":16865282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cisco","spark"],"created_at":"2024-08-03T16:00:20.616Z","updated_at":"2025-10-22T02:57:27.856Z","avatar_url":"https://github.com/flint-bot.png","language":"JavaScript","funding_links":["https://ko-fi.com/S6S46XSW"],"categories":["Client SDKs"],"sub_categories":["REST API clients"],"readme":"# node-sparky\n\n[![NPM](https://nodei.co/npm/node-sparky.png?downloads=true\u0026downloadRank=true\u0026stars=true)](https://nodei.co/npm/node-sparky/)\n\n#### Cisco Spark API for Node JS\n\nThis is a Cisco Spark API Library for Node JS. This project aims to simplify interaction with the Spark API while transparently handling more complex operations such as pagination, webhook creation, and webhook authentication. If you have a question, feature request, or have found a bug, please open an issue.\n\n#### Quick Start\n\n```js\nconst Spark = require('node-sparky');\n\nconst spark = new Spark({ token: '\u003ctoken\u003e' });\n\nspark.roomsGet(10)\n  .then(rooms =\u003e rooms.forEach(room =\u003e console.log(room.title)))\n  .catch(err =\u003e console.error(err));\n```\n\n## Features\n\n* [Rate limiting headers](https://developer.ciscospark.com/blog/blog-details-8193.html)\n  inspected to adjust request rates based on Cisco Spark API. These are\n  automatically re-queued and sent after the `retry-after` timer expires.\n* File processor for retrieving attachments from room.\n* Returns promises that comply with [A+ standards.](https://promisesaplus.com/).\n* Handles pagination transparently. (Receive unlimited records)\n* Support for [authenticated HMAC-SHA1 webhooks](https://developer.ciscospark.com/webhooks-explained.html#sensitive-data)\n\n## Using node-sparky as a Node JS Package\n\nThis module can be installed via NPM:\n\n```bash\nnpm install node-sparky --save\n```\n\n## Using node-sparky webhook event parser in an Express App\n\n```js\nconst Spark = require('node-sparky');\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst when = require('when');\n\nconst spark = new Spark({\n  token: '\u003cmy token\u003e',\n  webhookSecret: 'somesecr3t',\n});\n\nconst port = parseInt(process.env.PORT || '3000', 10);\n\n// add events\nspark.on('messages-created', msg =\u003e console.log(`${msg.personEmail} said: ${msg.text}`));\n\nconst app = express();\napp.use(bodyParser.json());\n\n// add route for path that is listening for web hooks\napp.post('/webhook', spark.webhookListen());\n\n// start express server\napp.listen(port, function() {\n  // get exisiting webhooks\n  spark.webhooksGet()\n    // remove all existing webhooks\n    .then(webhooks =\u003e when.map(webhooks, webhook =\u003e spark.webhookRemove(webhook.id)))\n    // create spark webhook directed back to the externally accessible\n    // express route defined above.\n    .then(() =\u003e spark.webhookAdd({\n      name: 'my webhook',\n      targetUrl: 'https://example.com/webhook',\n      resource: 'all',\n      event: 'all',\n    });\n  console.log(`Listening on port ${port}`);\n});\n```\n\n## Using node-sparky in the Browser\n\nYou can use node-sparky on the client side browser as well. Simply include\n`\u003cscript src=\"browser/node-sparky.js\"\u003e\u003c/script\u003e` in your page and you can use\nnode-sparky just as you can with with node-js.\n\n```html\n\u003chead\u003e\n    \u003ctitle\u003etest\u003c/title\u003e\n    \u003cscript src=\"https://code.jquery.com/jquery-3.2.1.min.js\"\u003e\u003c/script\u003e\n    \u003cscript src=\"browser/node-sparky.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n    \u003ch1\u003eTest\u003c/h1\u003e\n    \u003cdiv id=\"messageId\"\u003e\u003c/div\u003e\n\n    \u003cscript\u003e\n        $(document).ready(function() {\n            var spark = new Sparky({\n                token: '\u003cmy token\u003e'\n            });\n\n            var message = {\n                roomId: '\u003croom id\u003e',\n                text: 'Hello world!'\n            };\n\n            spark.messageSend(message)\n                .then(function(res) {\n                    $('#messageId').html(res.id);\n                })\n                .catch(function(err) {\n                    console.log(err);\n                });\n        });\n    \u003c/script\u003e\n\u003c/body\u003e\n\n\u003c/html\u003e\n```\n\n_**Note: The above is a simple example. It is not recommended to include the\ntoken in anything client accessible. This would ideally be part of a broader\napplication that makes use of oauth2 to cross authenticate the user to Spark to\ngrab their token through a Spark integration should you use node-sparky in the\nbrowser side JS.**_\n\n## Contributing\n\n#### Build\n\nThe `README.md` and `browser/node-sparky.*` files are auto-generated from the\nfiles in /lib and /docs. To regenerate these run:\n\n```bash\nnpm run build\n```\n\n#### Test\n\nTests require a user token and will not fully run using a bot token. It is\nassumed that the user token has Org Admin permissions. If not, certain tests\nWILL fail. The tests can be run via:\n\n```bash\ngit clone https://github.com/flint-bot/sparky\ncd sparky\nnpm install\nSPARKY_API_TOKEN=someUserTokenHere npm test\n```\n\n# Support this Project\n\nFind this project useful? Help suppport the continued development by submitting issues, feature requests, or code. Alternatively, you can...\n\n\u003ca href=\"https://ko-fi.com/S6S46XSW\"\u003e\u003cimg src=\"https://az743702.vo.msecnd.net/cdn/kofi1.png?v=0\" alt=\"Buy me a Coffee!\" height=\"36\"\u003e\u003c/a\u003e\n\n# Reference\n## Classes\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#Spark\"\u003eSpark\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Objects\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#File\"\u003eFile\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFile Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Event\"\u003eEvent\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eEvent Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#License\"\u003eLicense\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eLicense Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Membership\"\u003eMembership\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eMembership Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Message\"\u003eMessage\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eMessage Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Organization\"\u003eOrganization\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eOrganization Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Person\"\u003ePerson\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003ePerson Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Role\"\u003eRole\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eRole Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Room\"\u003eRoom\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eRoom Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Team\"\u003eTeam\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eTeam Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#TeamMembership\"\u003eTeamMembership\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eTeam Membership Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Webhook\"\u003eWebhook\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Validator\"\u003eValidator\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eSpark Object Validation\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Events\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#event_memberships\"\u003e\"memberships\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook membership event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_messages\"\u003e\"messages\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook messages event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_rooms\"\u003e\"rooms\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook rooms event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_memberships-created\"\u003e\"memberships-created\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Memberships Created event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_memberships-updated\"\u003e\"memberships-updated\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Memberships Updated event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_memberships-deleted\"\u003e\"memberships-deleted\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Memberships Deleted event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_messages-created\"\u003e\"messages-created\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Messages Created event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_messages-deleted\"\u003e\"messages-deleted\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Messages Deleted event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_rooms-created\"\u003e\"rooms-created\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Rooms Created event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_rooms-updated\"\u003e\"rooms-updated\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook Rooms Updated event\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_request\"\u003e\"request\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eWebhook request event\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003ca name=\"Spark\"\u003e\u003c/a\u003e\n\n## Spark\n**Kind**: global class  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| options | \u003ccode\u003eObject.\u0026lt;Options\u0026gt;\u003c/code\u003e | Sparky options object |\n\n\n* [Spark](#Spark)\n    * [new Spark(options)](#new_Spark_new)\n    * _instance_\n        * [.setToken(token)](#Spark+setToken) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\n    * _static_\n        * [.contentGet(contentId)](#Spark.contentGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File)\n        * [.contentCreate(filePath, [timeout])](#Spark.contentCreate) ⇒ [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File)\n        * [.eventsGet([eventSearch], [max])](#Spark.eventsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event)\n        * [.eventGet(eventId)](#Spark.eventGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event)\n        * [.licensesGet([orgId], [max])](#Spark.licensesGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;License\u0026gt;\u003c/code\u003e](#License)\n        * [.licenseGet(licenseId)](#Spark.licenseGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;License\u0026gt;\u003c/code\u003e](#License)\n        * [.membershipsGet([membershipSearch], [max])](#Spark.membershipsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\n        * [.membershipGet(membershipId)](#Spark.membershipGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\n        * [.membershipAdd(roomId, personEmail, [isModerator])](#Spark.membershipAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\n        * [.membershipUpdate(membership)](#Spark.membershipUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\n        * [.membershipRemove(membershipId)](#Spark.membershipRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.messagesGet(messageSearch, [max])](#Spark.messagesGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n        * [.messageGet(messageId)](#Spark.messageGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n        * [.messageSend(message, [file])](#Spark.messageSend) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n        * [.messageRemove(messageId)](#Spark.messageRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.organizationsGet([max])](#Spark.organizationsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization)\n        * [.organizationGet(orgId)](#Spark.organizationGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization)\n        * [.peopleGet([personSearch], [max])](#Spark.peopleGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\n        * [.personGet(personId)](#Spark.personGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\n        * [.personMe()](#Spark.personMe) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\n        * [.personAdd(person)](#Spark.personAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\n        * [.personUpdate(person)](#Spark.personUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\n        * [.personRemove(personId)](#Spark.personRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.rolesGet([max])](#Spark.rolesGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role)\n        * [.roleGet(roleId)](#Spark.roleGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role)\n        * [.roomsGet([roomSearch], [max])](#Spark.roomsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\n        * [.roomGet(roomId)](#Spark.roomGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\n        * [.roomAdd(title, [teamId])](#Spark.roomAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\n        * [.roomUpdate(room)](#Spark.roomUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\n        * [.roomRemove(roomId)](#Spark.roomRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.teamsGet([max])](#Spark.teamsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\n        * [.teamGet(teamId)](#Spark.teamGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\n        * [.teamAdd(name)](#Spark.teamAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\n        * [.teamUpdate(team)](#Spark.teamUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\n        * [.teamRemove(teamId)](#Spark.teamRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.teamMembershipsGet(teamId, [max])](#Spark.teamMembershipsGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\n        * [.teamMembershipGet(membershipId)](#Spark.teamMembershipGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\n        * [.teamMembershipAdd(teamId, personEmail, isModerator)](#Spark.teamMembershipAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\n        * [.teamMembershipUpdate(teamMembership)](#Spark.teamMembershipUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\n        * [.teamMembershipRemove(membershipId)](#Spark.teamMembershipRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.webhooksGet([webhookSearch], [max])](#Spark.webhooksGet) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\n        * [.webhookGet(webhookId)](#Spark.webhookGet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\n        * [.webhookAdd(webhookObj)](#Spark.webhookAdd) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\n        * [.webhookUpdate(webhookObj)](#Spark.webhookUpdate) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\n        * [.webhookRemove(webhookId)](#Spark.webhookRemove) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\n        * [.webhookAuth(secret, signature, payload)](#Spark.webhookAuth) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e\n        * [.webhookListen()](#Spark.webhookListen) ⇒ [\u003ccode\u003ewebhookHandler\u003c/code\u003e](#Spark.webhookListen..webhookHandler)\n            * [~webhookHandler(req, [res], [next])](#Spark.webhookListen..webhookHandler) ⇒ \u003ccode\u003eNull\u003c/code\u003e\n\n\u003ca name=\"new_Spark_new\"\u003e\u003c/a\u003e\n\n### new Spark(options)\nCreates a Spark API instance that is then attached to a Spark Account.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| options | \u003ccode\u003eObject.\u0026lt;Options\u0026gt;\u003c/code\u003e | Sparky options object |\n\n**Example**  \n```js\nconst Spark = require('node-sparky');\n\nconst spark = new Spark({\n  token: '\u003cmy token\u003e',\n  webhookSecret: 'somesecr3t',\n});\n\nspark.roomsGet(10)\n  .then(rooms =\u003e rooms.forEach(room =\u003e console.log(room.title)))\n  .catch(err =\u003e console.log(err);\n```\n\u003ca name=\"Spark+setToken\"\u003e\u003c/a\u003e\n\n### spark.setToken(token) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\nSet/Reset API token used in a Sparky instance. Use this function when needing\nto change an expired Token. Returns a fullfiled promise if token is valid,\nelse returns a rejected promise.\n\n**Kind**: instance method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise.String\u003c/code\u003e - Token promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | \u003ccode\u003eString\u003c/code\u003e | Spark API token |\n\n**Example**  \n```js\nspark.setToken('Tm90aGluZyB0byBzZWUgaGVyZS4uLiBNb3ZlIGFsb25nLi4u')\n  .then(token =\u003e console.log(token))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.contentGet\"\u003e\u003c/a\u003e\n\n### Spark.contentGet(contentId) ⇒ [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File)\nReturns a File Object specified by Content ID or Content URL.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File) - File object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| contentId | \u003ccode\u003eString\u003c/code\u003e | Spark Content ID or URL |\n\n**Example**  \n```js\nspark.contentGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(file =\u003e console.log('File name: %s', file.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.contentCreate\"\u003e\u003c/a\u003e\n\n### Spark.contentCreate(filePath, [timeout]) ⇒ [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File)\nCreate File Object from local file path.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;File\u0026gt;\u003c/code\u003e](#File) - File  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| filePath | \u003ccode\u003eString\u003c/code\u003e |  | Path to file |\n| [timeout] | \u003ccode\u003eInteger\u003c/code\u003e | \u003ccode\u003e15000\u003c/code\u003e | Timeout in ms to read file (optional) |\n\n**Example**  \n```js\nspark.contentCreate('/some/local/file.png')\n  .then(file =\u003e console.log(file.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.eventsGet\"\u003e\u003c/a\u003e\n\n### Spark.eventsGet([eventSearch], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event)\nList events in your organization. Several query parameters\nare available to filter the response. Long result sets will be split\ninto pages. Requires admin permissions in organization.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event) - Events Collection  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [eventSearch] | \u003ccode\u003eObject\u003c/code\u003e | Spark Event Search Object |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.eventsGet({ resource: 'messages' }, 10)\n  .then(events =\u003e events.forEach(event =\u003e console.log(event.data.text)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.eventGet\"\u003e\u003c/a\u003e\n\n### Spark.eventGet(eventId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event)\nReturn details of Spark Event by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Event\u0026gt;\u003c/code\u003e](#Event) - Spark Event object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| eventId | \u003ccode\u003eString\u003c/code\u003e | Spark Event ID |\n\n**Example**  \n```js\nspark.eventGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(event =\u003e console.log(event.data.text))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.licensesGet\"\u003e\u003c/a\u003e\n\n### Spark.licensesGet([orgId], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;License\u0026gt;\u003c/code\u003e](#License)\nReturns all Spark Licenses for a given Organization ID. If\nno organization ID argument is passed, licenses are returned for the\nOrganization that the authenticated account is in. If 'max' is not\nspecifed, returns all. Alternativly, you can pass a licenses object\ninstead of the orgId string.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;License\u0026gt;\u003c/code\u003e](#License) - Licenses Collection  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [orgId] | \u003ccode\u003eString\u003c/code\u003e | The organization ID to query (optional) |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.licensesGet('Tm90aGluZyB0byBzZWUgaGVy', 10)\n  .then(licenses =\u003e licenses.forEach(license =\u003e console.log(license.name)))\n  .catch(err =\u003e console.error(err));\n```\n**Example**  \n```js\nconst licenseSearchObj = {\n  orgId: 'Tm90aGluZyB0byBzZWUgaGVy',\n};\nspark.licensesGet(licenseSearchObj, 10)\n  .then(licenses =\u003e licenses.forEach(license =\u003e console.log(license.name)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.licenseGet\"\u003e\u003c/a\u003e\n\n### Spark.licenseGet(licenseId) ⇒ [\u003ccode\u003ePromise.\u0026lt;License\u0026gt;\u003c/code\u003e](#License)\nReturns a Spark License specified by License ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;License\u0026gt;\u003c/code\u003e](#License) - License  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| licenseId | \u003ccode\u003eString\u003c/code\u003e | Spark License ID |\n\n**Example**  \n```js\nspark.licenseGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(license =\u003e console.log(license.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.membershipsGet\"\u003e\u003c/a\u003e\n\n### Spark.membershipsGet([membershipSearch], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\nReturns all Spark Memberships that the authenticated account\nis in. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) - Array of Spark Membership objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [membershipSearch] | \u003ccode\u003eObject\u003c/code\u003e | Spark Membership Search Object (optional) |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return |\n\n**Example**  \n```js\nspark.membershipsGet({ roomId: 'Tm90aGluZyB0byBzZWUgaGVy' }, 10)\n  .then(memberships =\u003e memberships.forEach(membership =\u003e console.log(membership.id)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.membershipGet\"\u003e\u003c/a\u003e\n\n### Spark.membershipGet(membershipId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\nReturns Spark Membership by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) - Spark Membership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membershipId | \u003ccode\u003eString\u003c/code\u003e | Spark Membership ID |\n\n**Example**  \n```js\nspark.membershipGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(membership =\u003e console.log(membership.id))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.membershipAdd\"\u003e\u003c/a\u003e\n\n### Spark.membershipAdd(roomId, personEmail, [isModerator]) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\nAdd new Spark Membership given Room ID, email address, and\nmoderator status. Alternativly, you can pass a membership object as the\nonly argument.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) - Spark Membership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| roomId | \u003ccode\u003eString\u003c/code\u003e | Spark Room ID |\n| personEmail | \u003ccode\u003eString\u003c/code\u003e | Email address of person to add |\n| [isModerator] | \u003ccode\u003eBoolean\u003c/code\u003e | True if moderator |\n\n**Example**  \n```js\nspark.membershipAdd('Tm90aGluZyB0byBzZWUgaGVy', 'aperson@company.com')\n  .then(membership =\u003e console.log(membership.id))\n  .catch(err =\u003e console.error(err));\n```\n**Example**  \n```js\nconst membershipObj = {\n  personEmail: 'test@test.com',\n  roomId: 'Tm90aGluZyB0byBzZWUgaGVy',\n  isModerator: true,\n};\nspark.membershipAdd(membershipObj)\n  .then(membership =\u003e console.log(membership.id))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.membershipUpdate\"\u003e\u003c/a\u003e\n\n### Spark.membershipUpdate(membership) ⇒ [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership)\nUpdate a Membership.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) - Spark Membership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membership | [\u003ccode\u003eObject.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) | Spark Membership object |\n\n**Example**  \n```js\nspark.membershipGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then((membership) =\u003e {\n    membership.isModerator = true;\n    return spark.membershipUpdate(membership);\n  )\n  .then(membership =\u003e console.log(membership.isModerator))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.membershipRemove\"\u003e\u003c/a\u003e\n\n### Spark.membershipRemove(membershipId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Membership by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membershipId | \u003ccode\u003eString\u003c/code\u003e | Spark Membership ID |\n\n**Example**  \n```js\nspark.membershipRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Membership removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.messagesGet\"\u003e\u003c/a\u003e\n\n### Spark.messagesGet(messageSearch, [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nReturns Spark Message Objects. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) - Array of Spark Message objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messageSearch | \u003ccode\u003eObject\u003c/code\u003e | Spark Message Search Object |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.messagesGet({roomId: 'Tm90aGluZyB0byBzZWUgaGVy'}, 100)\n  .then(messages =\u003e messages.forEach(message =\u003e console.log(message.text)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.messageGet\"\u003e\u003c/a\u003e\n\n### Spark.messageGet(messageId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nReturn details of Spark Message by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) - Spark Message object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messageId | \u003ccode\u003eString\u003c/code\u003e | Spark Message ID |\n\n**Example**  \n```js\nspark.messageGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(message =\u003e console.log(message.text))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.messageSend\"\u003e\u003c/a\u003e\n\n### Spark.messageSend(message, [file]) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nSend Spark Message.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) - Spark Message object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | \u003ccode\u003eObject.\u0026lt;MessageAdd\u0026gt;\u003c/code\u003e | Spark Message Add Object |\n| [file] | [\u003ccode\u003eObject.\u0026lt;File\u0026gt;\u003c/code\u003e](#File) | File Object to add to message (optional) |\n\n**Example**  \n```js\nconst newMessage = {\n  roomId: 'Tm90aGluZyB0byBzZWUgaGVy',\n  text: 'Hello World'\n};\n\nspark.contentCreate('/some/file/with.ext')\n  .then(file =\u003e spark.messageSend(newMessage, file))\n  .then(message =\u003e console.log(message.id))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.messageRemove\"\u003e\u003c/a\u003e\n\n### Spark.messageRemove(messageId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Message by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messageId | \u003ccode\u003eString\u003c/code\u003e | Spark Message ID |\n\n**Example**  \n```js\nspark.messageRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Message removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.organizationsGet\"\u003e\u003c/a\u003e\n\n### Spark.organizationsGet([max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization)\nReturn all Spark Organizations that the authenticated\naccount is in. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization) - Array of Spark Organization objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.organizationsGet(10)\n  .then(organizations =\u003e organizations.forEach(organization =\u003e console.log(organization.id)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.organizationGet\"\u003e\u003c/a\u003e\n\n### Spark.organizationGet(orgId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization)\nReturn Spark Organization specified by License ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Organization\u0026gt;\u003c/code\u003e](#Organization) - Spark Organization object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| orgId | \u003ccode\u003eString\u003c/code\u003e | Spark Organization ID |\n\n**Example**  \n```js\nspark.organizationGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(organization =\u003e console.log(organization.id))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.peopleGet\"\u003e\u003c/a\u003e\n\n### Spark.peopleGet([personSearch], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\nReturns Spark Person Objects. If no arguments are passed and\nif the authenticated account is part of an Organization and if\nauthenticated account is assigned the Role of Organization Admin, returns\nall Spark Person objects from the Organizations that the user is in.\nOtherwise, the PersonSearch object should contain the key \"id\",\n\"displayName\", or \"email\" to query. If 'max' is not specifed, returns all\nmatched Person Objects.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) - Array of Spark Person objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [personSearch] | \u003ccode\u003eObject\u003c/code\u003e | Spark Person Search Object (optional) |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.peopleGet({ displayName: 'John' }, 10)\n  .then(people =\u003e people.forEach(person =\u003e console.log(person.displayName)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.personGet\"\u003e\u003c/a\u003e\n\n### Spark.personGet(personId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\nReturns a Spark Person Object specified by Person ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) - Spark Person object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| personId | \u003ccode\u003eString\u003c/code\u003e | Spark Person ID |\n\n**Example**  \n```js\nspark.personGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(person =\u003e console.log(person.displayName))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.personMe\"\u003e\u003c/a\u003e\n\n### Spark.personMe() ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\nReturn the Spark Person Object of the authenticated account.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) - Spark Person object  \n**Example**  \n```js\nspark.personMe()\n  .then(person =\u003e console.log(person.displayName))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.personAdd\"\u003e\u003c/a\u003e\n\n### Spark.personAdd(person) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\nAdd new Person.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) - Spark Person object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| person | [\u003ccode\u003eObject.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) | Spark Person object |\n\n**Example**  \n```js\nlet newPerson = {\n  emails: ['aperson@company.com'],\n  displayName: 'Any Person',\n  firstName: 'Any',\n  lastName: 'Person',\n  avatar: 'http://lorempixel.com/400/400/',\n  orgId: 'Tm90aGluZyB0byBzZWUgaGVy',\n  roles: ['Tm90aGluZyB0byBzZWUgaGVy'],\n  licenses: ['Tm90aGluZyB0byBzZWUgaGVy']\n};\n\nspark.personAdd(newPerson)\n  .then(person =\u003e console.log(person.displayName))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.personUpdate\"\u003e\u003c/a\u003e\n\n### Spark.personUpdate(person) ⇒ [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person)\nUpdate a Person.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) - Spark Person object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| person | [\u003ccode\u003eObject.\u0026lt;Person\u0026gt;\u003c/code\u003e](#Person) | Spark Person object |\n\n**Example**  \n```js\nspark.personGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then((person) =\u003e {\n    person.displayName = 'Another Person';\n    return spark.personUpdate(person);\n  })\n  .then(person =\u003e console.log(person.displayName))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.personRemove\"\u003e\u003c/a\u003e\n\n### Spark.personRemove(personId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Person by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| personId | \u003ccode\u003eString\u003c/code\u003e | Spark Person ID |\n\n**Example**  \n```js\nspark.personRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Person removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.rolesGet\"\u003e\u003c/a\u003e\n\n### Spark.rolesGet([max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role)\nReturns all Spark Roles that the authenticated account is\nin. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role) - Array of Spark Role object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.rolesGet(10)\n  .then(roles =\u003e roles.forEach(role =\u003e console.log(role.name)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roleGet\"\u003e\u003c/a\u003e\n\n### Spark.roleGet(roleId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role)\nReturns details for a Spark Role pecified by Role ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Role\u0026gt;\u003c/code\u003e](#Role) - Spark Role object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| roleId | \u003ccode\u003eString\u003c/code\u003e | Spark Role ID |\n\n**Example**  \n```js\nspark.roleGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(role =\u003e console.log(role.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roomsGet\"\u003e\u003c/a\u003e\n\n### Spark.roomsGet([roomSearch], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\nReturns Spark Room Objects. If roomSearch argument is not\npassed, returns all Spark Rooms that the authenticated account is in.\nIf 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) - Array of Spark Room objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [roomSearch] | \u003ccode\u003eObject.\u0026lt;RoomSearch\u0026gt;\u003c/code\u003e | Spark Person Search Object (optional) |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.roomsGet({ type: 'group' }, 10)\n  .then(rooms =\u003e rooms.forEach(room =\u003e console.log(room.title)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roomGet\"\u003e\u003c/a\u003e\n\n### Spark.roomGet(roomId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\nReturns a Spark Room Object specified by Room ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) - Spark Room object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| roomId | \u003ccode\u003eString\u003c/code\u003e | Spark Room ID |\n\n**Example**  \n```js\nspark.roomGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(room =\u003e console.log(room.title))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roomAdd\"\u003e\u003c/a\u003e\n\n### Spark.roomAdd(title, [teamId]) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\nAdd new Spark Room.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) - Spark Room object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| title | \u003ccode\u003eString\u003c/code\u003e | Title for a new Room |\n| [teamId] | \u003ccode\u003eString\u003c/code\u003e | Team ID (optional) |\n\n**Example**  \n```js\nspark.roomAdd('myroom')\n  .then(room =\u003e console.log(room.title))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roomUpdate\"\u003e\u003c/a\u003e\n\n### Spark.roomUpdate(room) ⇒ [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room)\nUpdate a Spark Room.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) - Spark Room object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| room | [\u003ccode\u003eObject.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) | Spark Room object |\n\n**Example**  \n```js\nspark.roomGet(Tm90aGluZyB0byBzZWUgaGVy)\n  .then((room) =\u003e {\n    room.title = 'Another Title';\n    return spark.roomUpdate(room);\n  )\n  .then(room =\u003e console.log(room.title))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.roomRemove\"\u003e\u003c/a\u003e\n\n### Spark.roomRemove(roomId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Room by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| roomId | \u003ccode\u003eString\u003c/code\u003e | Spark Room ID |\n\n**Example**  \n```js\nspark.roomRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Room removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamsGet\"\u003e\u003c/a\u003e\n\n### Spark.teamsGet([max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\nReturn all Spark Teams that the authenticated account is in.\nIf 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team) - Teams Collection  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return (optional) |\n\n**Example**  \n```js\nspark.teamsGet(10)\n  .then(teams =\u003e teams.forEach(team =\u003e console.log(team.name)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamGet\"\u003e\u003c/a\u003e\n\n### Spark.teamGet(teamId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\nReturns a Spark Team Object specified by Team ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team) - Team  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Spark Team ID |\n\n**Example**  \n```js\nspark.teamGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(team =\u003e console.log(team.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamAdd\"\u003e\u003c/a\u003e\n\n### Spark.teamAdd(name) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\nAdd new Spark Team.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team) - Team  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| name | \u003ccode\u003eString\u003c/code\u003e | Name for new Team |\n\n**Example**  \n```js\nspark.teamAdd('myteam')\n  .then(team =\u003e console.log(team.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamUpdate\"\u003e\u003c/a\u003e\n\n### Spark.teamUpdate(team) ⇒ [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team)\nUpdate a Team.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team) - Team  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| team | [\u003ccode\u003eObject.\u0026lt;Team\u0026gt;\u003c/code\u003e](#Team) | Spark Team Object |\n\n**Example**  \n```js\nspark.teamGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then((team) =\u003e {\n    team.name = 'Another Team';\n    return spark.teamUpdate(team);\n  })\n  .then(team =\u003e console.log(team.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamRemove\"\u003e\u003c/a\u003e\n\n### Spark.teamRemove(teamId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Team by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Spark Team ID |\n\n**Example**  \n```js\nspark.teamRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Team removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamMembershipsGet\"\u003e\u003c/a\u003e\n\n### Spark.teamMembershipsGet(teamId, [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\nReturn all Spark Team Memberships for a specific Team that\nthe authenticated account is in. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership) - Array of Spark TeamMembership objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Spark Team Memebership ID |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return |\n\n**Example**  \n```js\nspark.teamMembershipsGet('Tm90aGluZyB0byBzZWUgaGVy', 100)\n  .then(tms =\u003e tms.forEach(tm =\u003e console.log(tm.personEmail)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamMembershipGet\"\u003e\u003c/a\u003e\n\n### Spark.teamMembershipGet(membershipId) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\nReturn Spark Team Membership specified by Membership ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership) - Spark TeamMembership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membershipId | \u003ccode\u003eString\u003c/code\u003e | Spark Membership ID |\n\n**Example**  \n```js\nspark.membershipGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(tm =\u003e console.log(tm.personEmail))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamMembershipAdd\"\u003e\u003c/a\u003e\n\n### Spark.teamMembershipAdd(teamId, personEmail, isModerator) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\nAdd new Spark Team Membership.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership) - Spark TeamMembership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Spark Team Memebership ID |\n| personEmail | \u003ccode\u003eString\u003c/code\u003e | Email address of person to add |\n| isModerator | \u003ccode\u003eBoolean\u003c/code\u003e | Boolean value to add as moderator |\n\n**Example**  \n```js\nspark.teamMembershipAdd('Tm90aGluZyB0byBzZWUgaGVy', 'aperson@company.com')\n  .then(tm =\u003e console.log(tm.personEmail))\n  .catch(err =\u003e console.error(err));\n```\n**Example**  \n```js\nconst teamMembershipObj = {\n  personEmail: 'test@test.com',\n  teamId: 'Tm90aGluZyB0byBzZWUgaGVy',\n  isModerator: true,\n};\nspark.teamMembershipAdd(teamMembershipObj)\n  .then(tm =\u003e console.log(tm.personEmail))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamMembershipUpdate\"\u003e\u003c/a\u003e\n\n### Spark.teamMembershipUpdate(teamMembership) ⇒ [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership)\nUpdate a Team Membership.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership) - Spark TeamMembership object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamMembership | [\u003ccode\u003eobject.\u0026lt;TeamMembership\u0026gt;\u003c/code\u003e](#TeamMembership) | Spark TeamMembership object |\n\n**Example**  \n```js\nspark.teamMembershipGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then((tm) =\u003e {\n    tm.isModerator = true;\n    return spark.teamMembershipUpdate(tm);\n  )\n  .then(tm =\u003e console.log(tm.isModerator))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.teamMembershipRemove\"\u003e\u003c/a\u003e\n\n### Spark.teamMembershipRemove(membershipId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Team Membership by ID..\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membershipId | \u003ccode\u003eString\u003c/code\u003e | Spark Team Membership ID |\n\n**Example**  \n```js\nspark.teamMembershipRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Team Membership removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhooksGet\"\u003e\u003c/a\u003e\n\n### Spark.webhooksGet([webhookSearch], [max]) ⇒ [\u003ccode\u003ePromise.Array.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\nReturns all webhooks for authenticated account with optional\nsearch criteria to filter results. If 'max' is not specifed, returns all.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.Array.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) - Array of Spark Webhook objects  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [webhookSearch] | \u003ccode\u003eObject\u003c/code\u003e | Webhook Search object |\n| [max] | \u003ccode\u003eInteger\u003c/code\u003e | Number of records to return |\n\n**Example**  \n```js\nspark.webhooksGet(10)\n  .then(webhooks =\u003e webhooks.forEach(webhook =\u003e console.log(webhook.name)))\n  .catch(err =\u003e console.error(err));\n```\n**Example**  \n```js\nspark.webhooksGet({ name: 'My Awesome Webhook' }, 10)\n  .then(webhooks =\u003e webhooks.forEach(webhook =\u003e console.log(webhook.name)))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookGet\"\u003e\u003c/a\u003e\n\n### Spark.webhookGet(webhookId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\nReturns details of Spark Webhook Object specified by Webhook ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) - Spark Webhook object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhookId | \u003ccode\u003eString\u003c/code\u003e | Spark Webhook ID |\n\n**Example**  \n```js\nspark.webhookGet('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(webhook =\u003e console.log(webhook.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookAdd\"\u003e\u003c/a\u003e\n\n### Spark.webhookAdd(webhookObj) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\nAdd new Webhook.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) - Spark Webhook object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhookObj | [\u003ccode\u003eObject.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) | Spark Webhook object |\n\n**Example**  \n```js\nconst newWebhook = {\n  name: 'my webhook',\n  targetUrl: 'https://example.com/webhook',\n  resource: 'memberships',\n  event: 'created',\n  filter: 'roomId=Tm90aGluZyB0byBzZWUgaGVy'\n};\n\nspark.webhookAdd(newWebhook)\n  .then(webhook =\u003e console.log(webhook.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookUpdate\"\u003e\u003c/a\u003e\n\n### Spark.webhookUpdate(webhookObj) ⇒ [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook)\nUpdate a Webhook.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ePromise.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) - Spark Webhook Object  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhookObj | [\u003ccode\u003eObject.\u0026lt;Webhook\u0026gt;\u003c/code\u003e](#Webhook) | Spark Webhook Object |\n\n**Example**  \n```js\nspark.webhookGet(Tm90aGluZyB0byBzZWUgaGVy)\n  .then((webhook) =\u003e {\n    webhook.name = 'Another Webhook';\n    return spark.webhookUpdate(webhook);\n  })\n  .then(webhook =\u003e console.log(webhook.name))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookRemove\"\u003e\u003c/a\u003e\n\n### Spark.webhookRemove(webhookId) ⇒ \u003ccode\u003ePromise\u003c/code\u003e\nRemove Spark Webhook by ID.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise\u003c/code\u003e - Fulfilled promise  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhookId | \u003ccode\u003eString\u003c/code\u003e | Spark Webhook ID. |\n\n**Example**  \n```js\nspark.webhookRemove('Tm90aGluZyB0byBzZWUgaGVy')\n  .then(() =\u003e console.log('Webhook removed.'))\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookAuth\"\u003e\u003c/a\u003e\n\n### Spark.webhookAuth(secret, signature, payload) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e\nAuthenticate X-Spark-Signature HMAC-SHA1 Hash.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: \u003ccode\u003ePromise.String\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e - payload  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| secret | \u003ccode\u003eString\u003c/code\u003e | Value of secret used when creating webhook |\n| signature | \u003ccode\u003eString\u003c/code\u003e | Value of \"X-Spark-Signature\" from header |\n| payload | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e | This can either be the json object or a string representation of the webhook's body json payload |\n\n**Example**  \n```js\nconst sig = req.headers['x-spark-signature'];\nconst secret = 'mySecret';\n\nspark.webhookAuth(secret, sig, req.body)\n  .then(() =\u003e console.log('Webhook is valid');\n  .catch(err =\u003e console.error(err));\n```\n\u003ca name=\"Spark.webhookListen\"\u003e\u003c/a\u003e\n\n### Spark.webhookListen() ⇒ [\u003ccode\u003ewebhookHandler\u003c/code\u003e](#Spark.webhookListen..webhookHandler)\nProcess request from connect, express, or resitify routes.\nReturns function that accepts req, res, and next arguments.\n\n**Kind**: static method of [\u003ccode\u003eSpark\u003c/code\u003e](#Spark)  \n**Returns**: [\u003ccode\u003ewebhookHandler\u003c/code\u003e](#Spark.webhookListen..webhookHandler) - function  \n**Example**  \n```js\nconst Spark = require('node-sparky');\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst when = require('when');\n\nconst spark = new Spark({\n  token: '\u003cmy token\u003e',\n  webhookSecret: 'somesecr3t',\n});\n\nconst port = parseInt(process.env.PORT || '3000', 10);\n\n// add events\nspark.on('messages-created', msg =\u003e console.log(`${msg.personEmail} said: ${msg.text}`));\n\nconst app = express();\napp.use(bodyParser.json());\n\n// add route for path that is listening for web hooks\napp.post('/webhook', spark.webhookListen());\n\n// start express server\napp.listen(port, function() {\n  // get exisiting webhooks\n  spark.webhooksGet()\n    // remove all existing webhooks\n    .then(webhooks =\u003e when.map(webhooks, webhook =\u003e spark.webhookRemove(webhook.id)))\n    // create spark webhook directed back to the externally accessible\n    // express route defined above.\n    .then(() =\u003e spark.webhookAdd({\n      name: 'my webhook',\n      targetUrl: 'https://example.com/webhook',\n      resource: 'all',\n      event: 'all',\n    });\n  console.log(`Listening on port ${port}`);\n});\n```\n\u003ca name=\"Spark.webhookListen..webhookHandler\"\u003e\u003c/a\u003e\n\n#### webhookListen~webhookHandler(req, [res], [next]) ⇒ \u003ccode\u003eNull\u003c/code\u003e\nFunction returned by spark.webhookListen()\n\n**Kind**: inner method of [\u003ccode\u003ewebhookListen\u003c/code\u003e](#Spark.webhookListen)  \n**Returns**: \u003ccode\u003eNull\u003c/code\u003e - null value  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| req | \u003ccode\u003eObject\u003c/code\u003e | request object |\n| [res] | \u003ccode\u003eObject\u003c/code\u003e | response object |\n| [next] | \u003ccode\u003efunction\u003c/code\u003e | next function |\n\n\u003ca name=\"File\"\u003e\u003c/a\u003e\n\n## File : \u003ccode\u003eobject\u003c/code\u003e\nFile Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| name | \u003ccode\u003eString\u003c/code\u003e | File name |\n| ext | \u003ccode\u003eString\u003c/code\u003e | File extension |\n| type | \u003ccode\u003eString\u003c/code\u003e | Header [content-type] for file |\n| binary | \u003ccode\u003eBuffer\u003c/code\u003e | File contents as binary |\n| base64 | \u003ccode\u003eString\u003c/code\u003e | File contents as base64 encoded string |\n\n\u003ca name=\"Event\"\u003e\u003c/a\u003e\n\n## Event : \u003ccode\u003eobject\u003c/code\u003e\nEvent Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Event ID |\n| resource | \u003ccode\u003eString\u003c/code\u003e | Event resource |\n| type | \u003ccode\u003eString\u003c/code\u003e | Event type |\n| actorId | \u003ccode\u003eString\u003c/code\u003e | Person ID that triggered event |\n| orgId | \u003ccode\u003eString\u003c/code\u003e | Organzation ID that event occurred in |\n| appId | \u003ccode\u003eString\u003c/code\u003e | Application ID |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Event created (ISO 8601) |\n| data | \u003ccode\u003eObject\u003c/code\u003e | Event data object |\n\n\u003ca name=\"License\"\u003e\u003c/a\u003e\n\n## License : \u003ccode\u003eobject\u003c/code\u003e\nLicense Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | License ID |\n| name | \u003ccode\u003eString\u003c/code\u003e | License name |\n| totalUnits | \u003ccode\u003eInteger\u003c/code\u003e | Total units of license available |\n| consumedUnits | \u003ccode\u003eInteger\u003c/code\u003e | Number of license units consumed |\n\n\u003ca name=\"Membership\"\u003e\u003c/a\u003e\n\n## Membership : \u003ccode\u003eobject\u003c/code\u003e\nMembership Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Membership ID |\n| roomId | \u003ccode\u003eString\u003c/code\u003e | Room ID |\n| personId | \u003ccode\u003eString\u003c/code\u003e | Person ID |\n| personEmail | \u003ccode\u003eString\u003c/code\u003e | Person Email |\n| isModerator | \u003ccode\u003eBoolean\u003c/code\u003e | Membership is a moderator |\n| isMonitor | \u003ccode\u003eBoolean\u003c/code\u003e | Membership is a monitor |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Membership created (ISO 8601) |\n\n\u003ca name=\"Message\"\u003e\u003c/a\u003e\n\n## Message : \u003ccode\u003eobject\u003c/code\u003e\nMessage Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Message ID |\n| roomId | \u003ccode\u003eString\u003c/code\u003e | Room ID |\n| roomType | \u003ccode\u003eString\u003c/code\u003e | Room Type |\n| toPersonId | \u003ccode\u003eString\u003c/code\u003e | Person ID |\n| toPersonEmail | \u003ccode\u003eString\u003c/code\u003e | Person Email |\n| text | \u003ccode\u003eString\u003c/code\u003e | Message text |\n| markdown | \u003ccode\u003eString\u003c/code\u003e | Message markdown |\n| files | \u003ccode\u003eArray.\u0026lt;String\u0026gt;\u003c/code\u003e | Array of File URLs |\n| personId | \u003ccode\u003eString\u003c/code\u003e | Person ID |\n| personEmail | \u003ccode\u003eString\u003c/code\u003e | Person Email |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Message created (ISO 8601) |\n| mentionedPeople | \u003ccode\u003eArray.String\u003c/code\u003e | Person IDs of those mentioned in Message |\n\n\u003ca name=\"Organization\"\u003e\u003c/a\u003e\n\n## Organization : \u003ccode\u003eobject\u003c/code\u003e\nOrganization Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Organization ID |\n| displayName | \u003ccode\u003eString\u003c/code\u003e | Organization name |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Organization created (ISO 8601) |\n\n\u003ca name=\"Person\"\u003e\u003c/a\u003e\n\n## Person : \u003ccode\u003eobject\u003c/code\u003e\nPerson Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Person ID |\n| emails | \u003ccode\u003eArray.String\u003c/code\u003e | Array of email addresses |\n| displayName | \u003ccode\u003eString\u003c/code\u003e | Display name |\n| firstName | \u003ccode\u003eString\u003c/code\u003e | First name |\n| lastName | \u003ccode\u003eString\u003c/code\u003e | Last name |\n| avatar | \u003ccode\u003eString\u003c/code\u003e | Avatar URL |\n| orgId | \u003ccode\u003eString\u003c/code\u003e | Organization ID |\n| roles | \u003ccode\u003eArray.String\u003c/code\u003e | Array of assigned Role IDs |\n| licenses | \u003ccode\u003eArray.String\u003c/code\u003e | Array of assigned License IDs |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date created (ISO 8601) |\n\n\u003ca name=\"Role\"\u003e\u003c/a\u003e\n\n## Role : \u003ccode\u003eobject\u003c/code\u003e\nRole Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Role ID |\n| name | \u003ccode\u003eString\u003c/code\u003e | Role name |\n\n\u003ca name=\"Room\"\u003e\u003c/a\u003e\n\n## Room : \u003ccode\u003eobject\u003c/code\u003e\nRoom Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Room ID |\n| title | \u003ccode\u003eString\u003c/code\u003e | Room Title |\n| type | \u003ccode\u003eString\u003c/code\u003e | Room Type |\n| isLocked | \u003ccode\u003eBoolean\u003c/code\u003e | Room Moderated/Locked |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Team ID |\n| lastActivity | \u003ccode\u003eString\u003c/code\u003e | Last Activity in Room (ISO 8601) |\n| creatorId | \u003ccode\u003eString\u003c/code\u003e | person ID of Room creator (ISO 8601) |\n| created | \u003ccode\u003eString\u003c/code\u003e | Room Created (ISO 8601) |\n\n\u003ca name=\"Team\"\u003e\u003c/a\u003e\n\n## Team : \u003ccode\u003eobject\u003c/code\u003e\nTeam Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Message ID |\n| name | \u003ccode\u003eString\u003c/code\u003e | Team name |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Team created (ISO 8601) |\n\n\u003ca name=\"TeamMembership\"\u003e\u003c/a\u003e\n\n## TeamMembership : \u003ccode\u003eobject\u003c/code\u003e\nTeam Membership Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Membership ID |\n| teamId | \u003ccode\u003eString\u003c/code\u003e | Team ID |\n| personId | \u003ccode\u003eString\u003c/code\u003e | Person ID |\n| personEmail | \u003ccode\u003eString\u003c/code\u003e | Person Email |\n| isModerator | \u003ccode\u003eBoolean\u003c/code\u003e | Membership is a moderator |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Membership created (ISO 8601) |\n\n\u003ca name=\"Webhook\"\u003e\u003c/a\u003e\n\n## Webhook : \u003ccode\u003eobject\u003c/code\u003e\nWebhook Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | Webhook ID |\n| name | \u003ccode\u003eString\u003c/code\u003e | Webhook name |\n| targetUrl | \u003ccode\u003eString\u003c/code\u003e | Webhook target URL |\n| resource | \u003ccode\u003eString\u003c/code\u003e | Webhook resource |\n| event | \u003ccode\u003eString\u003c/code\u003e | Webhook event |\n| filter | \u003ccode\u003eString\u003c/code\u003e | Webhook filter |\n| created | \u003ccode\u003eString\u003c/code\u003e | Date Webhook created (ISO 8601) |\n\n\u003ca name=\"Validator\"\u003e\u003c/a\u003e\n\n## Validator : \u003ccode\u003eobject\u003c/code\u003e\nSpark Object Validation\n\n**Kind**: global namespace  \n\n* [Validator](#Validator) : \u003ccode\u003eobject\u003c/code\u003e\n    * [.isFile(filePath)](#Validator.isFile) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\n    * [.isDir(dirPath)](#Validator.isDir) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\n    * [.isToken(token)](#Validator.isToken) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\n    * [.isEmail(email)](#Validator.isEmail) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isEmails(emails)](#Validator.isEmails) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isUrl(url)](#Validator.isUrl) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isFilePath(path)](#Validator.isFilePath) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isOptions(options)](#Validator.isOptions) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isFile(file)](#Validator.isFile) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isEvent(event)](#Validator.isEvent) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isEvents(events)](#Validator.isEvents) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isEventSearch(searchObj)](#Validator.isEventSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isLicense(license)](#Validator.isLicense) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isLicenses(licenses)](#Validator.isLicenses) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isLicenseSearch(searchObj)](#Validator.isLicenseSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMembership(membership)](#Validator.isMembership) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMemberships(memberships)](#Validator.isMemberships) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMembershipSearch(searchObj)](#Validator.isMembershipSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMessage(message)](#Validator.isMessage) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMessages(messages)](#Validator.isMessages) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isMessageSearch(searchObj)](#Validator.isMessageSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isOrganization(organization)](#Validator.isOrganization) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isOrganizations(organizations)](#Validator.isOrganizations) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isPerson(person)](#Validator.isPerson) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isPeople(people)](#Validator.isPeople) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isPersonSearch(searchObj)](#Validator.isPersonSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isRole(role)](#Validator.isRole) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isRoles(roles)](#Validator.isRoles) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isRoom(room)](#Validator.isRoom) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isRooms(rooms)](#Validator.isRooms) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isRoomSearch(searchObj)](#Validator.isRoomSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isTeam(team)](#Validator.isTeam) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isTeams(teams)](#Validator.isTeams) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isTeamMembership(teamMembership)](#Validator.isTeamMembership) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isTeamMemberships(teamMemberships)](#Validator.isTeamMemberships) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isTeamMembershipSearch(searchObj)](#Validator.isTeamMembershipSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isWebhook(webhook)](#Validator.isWebhook) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isWebhooks(webhooks)](#Validator.isWebhooks) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.isWebhookSearch(searchObj)](#Validator.isWebhookSearch) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n\n\u003ca name=\"Validator.isFile\"\u003e\u003c/a\u003e\n\n### Validator.isFile(filePath) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\nValidate filePath resolves to existing file. Returns fulfilled Promise with\nfilePath if valid, else returns rejected Promise if not valid.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003ePromise.String\u003c/code\u003e - Absolute path to file  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| filePath | \u003ccode\u003eString\u003c/code\u003e | Absolute path to file |\n\n\u003ca name=\"Validator.isDir\"\u003e\u003c/a\u003e\n\n### Validator.isDir(dirPath) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\nValidate filePath resolves to existing dir. Returns fulfilled Promise with\ndirPath if valid, else returns rejected Promise if not valid.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003ePromise.String\u003c/code\u003e - Absolute path to a directory  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| dirPath | \u003ccode\u003eString\u003c/code\u003e | Absolute path to a directory |\n\n\u003ca name=\"Validator.isToken\"\u003e\u003c/a\u003e\n\n### Validator.isToken(token) ⇒ \u003ccode\u003ePromise.String\u003c/code\u003e\nValidate Spark Token is valid by sending request to API to determine if\nauthorized. Returns fulfilled Promise with token if valid, else returns rejected\nPromise if not valid.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003ePromise.String\u003c/code\u003e - Cisco Spark Token  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | \u003ccode\u003eString\u003c/code\u003e | Cisco Spark Token |\n\n\u003ca name=\"Validator.isEmail\"\u003e\u003c/a\u003e\n\n### Validator.isEmail(email) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate String is Email.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| email | \u003ccode\u003eString\u003c/code\u003e | Email address string |\n\n\u003ca name=\"Validator.isEmails\"\u003e\u003c/a\u003e\n\n### Validator.isEmails(emails) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Emails in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| emails | \u003ccode\u003eArray\u003c/code\u003e | Array of Email address string |\n\n\u003ca name=\"Validator.isUrl\"\u003e\u003c/a\u003e\n\n### Validator.isUrl(url) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate String is URL.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| url | \u003ccode\u003eString\u003c/code\u003e | URL String |\n\n\u003ca name=\"Validator.isFilePath\"\u003e\u003c/a\u003e\n\n### Validator.isFilePath(path) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate String is File path and not a URL/URI.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| path | \u003ccode\u003eString\u003c/code\u003e | String to test |\n\n\u003ca name=\"Validator.isOptions\"\u003e\u003c/a\u003e\n\n### Validator.isOptions(options) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Options object\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| options | \u003ccode\u003eObject.\u0026lt;Options\u0026gt;\u003c/code\u003e | Validate that object passed includes all valid options for sparky constructor |\n\n\u003ca name=\"Validator.isFile\"\u003e\u003c/a\u003e\n\n### Validator.isFile(file) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate File object\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| file | [\u003ccode\u003eObject.\u0026lt;File\u0026gt;\u003c/code\u003e](#File) | Validate that object passed includes all valid options required in a file object |\n\n\u003ca name=\"Validator.isEvent\"\u003e\u003c/a\u003e\n\n### Validator.isEvent(event) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Event Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| event | [\u003ccode\u003eEvent\u003c/code\u003e](#Event) | Event object |\n\n\u003ca name=\"Validator.isEvents\"\u003e\u003c/a\u003e\n\n### Validator.isEvents(events) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Event Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| events | \u003ccode\u003eArray\u003c/code\u003e | Array of Event objects |\n\n\u003ca name=\"Validator.isEventSearch\"\u003e\u003c/a\u003e\n\n### Validator.isEventSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Event Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eEventSearch\u003c/code\u003e | EventSearch object |\n\n\u003ca name=\"Validator.isLicense\"\u003e\u003c/a\u003e\n\n### Validator.isLicense(license) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark License Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| license | [\u003ccode\u003eLicense\u003c/code\u003e](#License) | License object |\n\n\u003ca name=\"Validator.isLicenses\"\u003e\u003c/a\u003e\n\n### Validator.isLicenses(licenses) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark License Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| licenses | \u003ccode\u003eArray\u003c/code\u003e | Array of License objects |\n\n\u003ca name=\"Validator.isLicenseSearch\"\u003e\u003c/a\u003e\n\n### Validator.isLicenseSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark License Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eLicenseSearch\u003c/code\u003e | LicenseSearch object |\n\n\u003ca name=\"Validator.isMembership\"\u003e\u003c/a\u003e\n\n### Validator.isMembership(membership) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Membership Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| membership | [\u003ccode\u003eMembership\u003c/code\u003e](#Membership) | Membership object |\n\n\u003ca name=\"Validator.isMemberships\"\u003e\u003c/a\u003e\n\n### Validator.isMemberships(memberships) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Membership Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| memberships | \u003ccode\u003eArray\u003c/code\u003e | Array of Membership objects |\n\n\u003ca name=\"Validator.isMembershipSearch\"\u003e\u003c/a\u003e\n\n### Validator.isMembershipSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Membership Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eMembershipSearch\u003c/code\u003e | MembershipSearch object |\n\n\u003ca name=\"Validator.isMessage\"\u003e\u003c/a\u003e\n\n### Validator.isMessage(message) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Message Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | [\u003ccode\u003eMessage\u003c/code\u003e](#Message) | Message object |\n\n\u003ca name=\"Validator.isMessages\"\u003e\u003c/a\u003e\n\n### Validator.isMessages(messages) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Message Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messages | \u003ccode\u003eArray\u003c/code\u003e | Array of Message objects |\n\n\u003ca name=\"Validator.isMessageSearch\"\u003e\u003c/a\u003e\n\n### Validator.isMessageSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Message Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eMessageSearch\u003c/code\u003e | MessageSearch object |\n\n\u003ca name=\"Validator.isOrganization\"\u003e\u003c/a\u003e\n\n### Validator.isOrganization(organization) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Organization Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| organization | [\u003ccode\u003eOrganization\u003c/code\u003e](#Organization) | Organization object |\n\n\u003ca name=\"Validator.isOrganizations\"\u003e\u003c/a\u003e\n\n### Validator.isOrganizations(organizations) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Organizations Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| organizations | \u003ccode\u003eArray\u003c/code\u003e | Array of Organization objects |\n\n\u003ca name=\"Validator.isPerson\"\u003e\u003c/a\u003e\n\n### Validator.isPerson(person) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Person Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| person | [\u003ccode\u003ePerson\u003c/code\u003e](#Person) | Person object |\n\n\u003ca name=\"Validator.isPeople\"\u003e\u003c/a\u003e\n\n### Validator.isPeople(people) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Person Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| people | \u003ccode\u003eArray\u003c/code\u003e | Array of Person objects |\n\n\u003ca name=\"Validator.isPersonSearch\"\u003e\u003c/a\u003e\n\n### Validator.isPersonSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Person Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003ePersonSearch\u003c/code\u003e | Person Search object |\n\n\u003ca name=\"Validator.isRole\"\u003e\u003c/a\u003e\n\n### Validator.isRole(role) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Role Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| role | [\u003ccode\u003eRole\u003c/code\u003e](#Role) | Role object |\n\n\u003ca name=\"Validator.isRoles\"\u003e\u003c/a\u003e\n\n### Validator.isRoles(roles) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Role Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| roles | \u003ccode\u003eArray\u003c/code\u003e | Array of Role objects |\n\n\u003ca name=\"Validator.isRoom\"\u003e\u003c/a\u003e\n\n### Validator.isRoom(room) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Room Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| room | [\u003ccode\u003eRoom\u003c/code\u003e](#Room) | Room Object |\n\n\u003ca name=\"Validator.isRooms\"\u003e\u003c/a\u003e\n\n### Validator.isRooms(rooms) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Room Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| rooms | \u003ccode\u003eArray\u003c/code\u003e | Array of Room objects |\n\n\u003ca name=\"Validator.isRoomSearch\"\u003e\u003c/a\u003e\n\n### Validator.isRoomSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Room Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eRoomSearch\u003c/code\u003e | RoomSearch object |\n\n\u003ca name=\"Validator.isTeam\"\u003e\u003c/a\u003e\n\n### Validator.isTeam(team) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Team Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| team | [\u003ccode\u003eTeam\u003c/code\u003e](#Team) | Team object |\n\n\u003ca name=\"Validator.isTeams\"\u003e\u003c/a\u003e\n\n### Validator.isTeams(teams) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Team Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teams | \u003ccode\u003eArray\u003c/code\u003e | Array of Team objects |\n\n\u003ca name=\"Validator.isTeamMembership\"\u003e\u003c/a\u003e\n\n### Validator.isTeamMembership(teamMembership) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Team Membership Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamMembership | [\u003ccode\u003eTeamMembership\u003c/code\u003e](#TeamMembership) | TeamMembership object |\n\n\u003ca name=\"Validator.isTeamMemberships\"\u003e\u003c/a\u003e\n\n### Validator.isTeamMemberships(teamMemberships) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Team Membership Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| teamMemberships | \u003ccode\u003eArray\u003c/code\u003e | Array of TeamMembership objects |\n\n\u003ca name=\"Validator.isTeamMembershipSearch\"\u003e\u003c/a\u003e\n\n### Validator.isTeamMembershipSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Team Memebership Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eTeamMembershipSearch\u003c/code\u003e | TeamMembership object |\n\n\u003ca name=\"Validator.isWebhook\"\u003e\u003c/a\u003e\n\n### Validator.isWebhook(webhook) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Webhook Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhook | [\u003ccode\u003eWebhook\u003c/code\u003e](#Webhook) | Webhook object |\n\n\u003ca name=\"Validator.isWebhooks\"\u003e\u003c/a\u003e\n\n### Validator.isWebhooks(webhooks) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Webhook Objects in Array.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| webhooks | \u003ccode\u003eArray\u003c/code\u003e | Array of Webhook objects |\n\n\u003ca name=\"Validator.isWebhookSearch\"\u003e\u003c/a\u003e\n\n### Validator.isWebhookSearch(searchObj) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nValidate Spark Webhook Search Object.\n\n**Kind**: static method of [\u003ccode\u003eValidator\u003c/code\u003e](#Validator)  \n**Returns**: \u003ccode\u003eBoolean\u003c/code\u003e - result  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| searchObj | \u003ccode\u003eWebhookSearch\u003c/code\u003e | TeamMembership object |\n\n\u003ca name=\"event_memberships\"\u003e\u003c/a\u003e\n\n## \"memberships\"\nWebhook membership event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| event | \u003ccode\u003eString\u003c/code\u003e | Triggered event (created, updated, deleted) |\n| membership | [\u003ccode\u003eObject.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) | Membership Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_messages\"\u003e\u003c/a\u003e\n\n## \"messages\"\nWebhook messages event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| event | \u003ccode\u003eString\u003c/code\u003e | Triggered event (created, deleted) |\n| message | [\u003ccode\u003eObject.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) | Message Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_rooms\"\u003e\u003c/a\u003e\n\n## \"rooms\"\nWebhook rooms event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| event | \u003ccode\u003eString\u003c/code\u003e | Triggered event (created, updated) |\n| room | [\u003ccode\u003eObject.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) | Room Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_memberships-created\"\u003e\u003c/a\u003e\n\n## \"memberships-created\"\nWebhook Memberships Created event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| membership | [\u003ccode\u003eObject.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) | Membership Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_memberships-updated\"\u003e\u003c/a\u003e\n\n## \"memberships-updated\"\nWebhook Memberships Updated event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| membership | [\u003ccode\u003eObject.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) | Membership Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_memberships-deleted\"\u003e\u003c/a\u003e\n\n## \"memberships-deleted\"\nWebhook Memberships Deleted event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| membership | [\u003ccode\u003eObject.\u0026lt;Membership\u0026gt;\u003c/code\u003e](#Membership) | Membership Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_messages-created\"\u003e\u003c/a\u003e\n\n## \"messages-created\"\nWebhook Messages Created event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| message | [\u003ccode\u003eObject.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) | Message Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_messages-deleted\"\u003e\u003c/a\u003e\n\n## \"messages-deleted\"\nWebhook Messages Deleted event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| message | [\u003ccode\u003eObject.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message) | Message Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_rooms-created\"\u003e\u003c/a\u003e\n\n## \"rooms-created\"\nWebhook Rooms Created event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| message | [\u003ccode\u003eObject.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) | Room Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_rooms-updated\"\u003e\u003c/a\u003e\n\n## \"rooms-updated\"\nWebhook Rooms Updated event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| message | [\u003ccode\u003eObject.\u0026lt;Room\u0026gt;\u003c/code\u003e](#Room) | Room Object found in Webhook |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n\u003ca name=\"event_request\"\u003e\u003c/a\u003e\n\n## \"request\"\nWebhook request event\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| reqBody | \u003ccode\u003eObject.\u0026lt;RequestBody\u0026gt;\u003c/code\u003e | Full Webhook Body Object |\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2018\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflint-bot%2Fsparky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflint-bot%2Fsparky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflint-bot%2Fsparky/lists"}