{"id":13764433,"url":"https://github.com/marchfederico/node-sparkclient","last_synced_at":"2026-02-21T14:11:03.037Z","repository":{"id":73344515,"uuid":"47990803","full_name":"marchfederico/node-sparkclient","owner":"marchfederico","description":"A simple implementation of the Cisco Spark APIs","archived":false,"fork":false,"pushed_at":"2017-03-29T23:11:32.000Z","size":33,"stargazers_count":7,"open_issues_count":1,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-05-07T02:49:06.623Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/marchfederico.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2015-12-14T17:34:31.000Z","updated_at":"2023-02-14T00:26:31.000Z","dependencies_parsed_at":"2024-01-30T06:59:06.890Z","dependency_job_id":"7b251664-7763-47ff-b7a6-1356759c4ffd","html_url":"https://github.com/marchfederico/node-sparkclient","commit_stats":{"total_commits":30,"total_committers":2,"mean_commits":15.0,"dds":0.2666666666666667,"last_synced_commit":"91cf64ef0cd9caba51a7d39548108f8bff8fe60e"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marchfederico%2Fnode-sparkclient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marchfederico%2Fnode-sparkclient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marchfederico%2Fnode-sparkclient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marchfederico%2Fnode-sparkclient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marchfederico","download_url":"https://codeload.github.com/marchfederico/node-sparkclient/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253470703,"owners_count":21913717,"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":[],"created_at":"2024-08-03T16:00:20.507Z","updated_at":"2026-02-21T14:10:58.018Z","avatar_url":"https://github.com/marchfederico.png","language":"JavaScript","funding_links":[],"categories":["Client SDKs"],"sub_categories":["REST API clients"],"readme":"Node Cisco Spark Client\n===========================================\n\n[node-sparkclient](https://github.com/marchfederico/node-sparkclient) is node Cisco Spark module. It provides a simple way to work with the Cisco Spark APIs\n\n## Installation\n\n`npm install node-sparkclient`\n\n## Usage\n\nThis module assumes you have received an access token from the Cisco Spark Oauth2 service.\n\n## The  Cisco Spark Client Library Functions\n\n### Pagination\nAll list api function calls support pagination. To get the next page of results, simply call the specific list function with 'next' as the first parameter.  Examples below.\n\n### Create the Spark Client object\n\n#### CiscoSparkClient(accessToken)\n```javascript\n    var sparkClient = new CiscoSparkClient('Kjc0YTA5MWUtZTJlYi00NzNhLWI2NGQtYzAxOGJkZjat27ZlMzZkY2U2OWQtNTdi')\n```\n---\n\n### Room Functions\nRooms are virtual meeting place where people post messages and collaborate to get work done. This API is used to manage the rooms themselves.\n#### CiscoSparkClient.listRooms(maxRooms, callback)\n```javascript\n    sparkClient.listRooms(10, function(err, rooms) {\n        if (!err) {\n            for (i=0;i\u003crooms.items.length;i++) {\n                console.log(rooms.items[i].id)\n                console.log(rooms.items[i].title)\n                console.log(rooms.items[i].created)\n                console.log(rooms.items[i].lastActivity)\n            }\n            //get the next 10 rooms\n            sparkClient.listRooms(\"next\", function(err, rooms) {\n                //do something else here\n                for (i=0;i\u003crooms.items.length;i++) {\n                    console.log(rooms.items[i].id)\n                    console.log(rooms.items[i].title)\n                    console.log(rooms.items[i].created)\n                    console.log(rooms.items[i].lastActivity)\n                }\n            })\n        }\n    })\n```\n\n#### CiscoSparkClient.createRoom(title, callback)\n```javascript\n    sparkClient.createRoom(\"My New Room\", function(err, room) {\n        if (!err)\n            console.log(room.id)\n            console.log(room.title)\n            console.log(room.created)\n    })\n```\n\n#### CiscoSparkClient.updateRoom(roomId,title, callback)\n```javascript\n    sparkClient.updateRoom(\"Y2lzY29zcGFyazovL3VzL1JPT00vY2ZjNmY5NzAtYTAzNi0xMWU1LWJlOGYtODVmMTM2MmM4YWZk\", \"New Title\", function(err, room) {\n        if (!err)\n            console.log(room.id)\n            console.log(room.title)\n            console.log(room.created)\n    })\n```\n\n#### CiscoSparkClient.getRoom(roomId, callback)\n```javascript\n    sparkClient.getRoom(\"Y2lzY29zcGFyazovL3VzL1JPT00vNDAyNjRhZjAtOWVlYy0xMWU1LTkwOGEtODUyZTZhOGJlMTBh\", function(err, room) {\n        if (!err)\n            console.log(room.id)\n            console.log(room.title)\n            console.log(room.created)\n            console.log(room.lastActivity)\n    })\n```\n\n#### CiscoSparkClient.deleteRoom(roomId, callback)\n```javascript\n    sparkClient.deleteRoom(\"Y2lzY29zcGFyazovL3VzL1JPT00vNDAyNjRhZjAtOWVlYy0xMWU1LTkwOGEtODUyZTZhOGJlMTBh\", function(err, response) {\n        if (!err)\n            console.log(response.message)\n    })\n```\n---\n### Message Functions\nMessages are how we communicate in a room. In Spark, each message is displayed on its own line along with a timestamp and sender information. Use this API to list, create, and delete messages.\n#### CiscoSparkClient.listMessages(roomId, \\[queryParams\\], callback)\n```javascript\n    queryParams = {}  // Query Parameters are optional\n    queryParams.before = '2015-12-11T22:44:10.511Z'\n    queryParams.beforeMessage = 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjFjYjExZjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk'\n    queryParams.max = 10\n\n    sparkClient.listMessages(\"Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2\", queryParams, function(err, messages) {\n        if (!err)\n            for (i=0;i\u003cmessages.items.length;i++) {\n                console.log(messages.items[i].id)\n                console.log(messages.items[i].roomId)\n                console.log(messages.items[i].personId)\n                console.log(messages.items[i].personEmail)\n                console.log(messages.items[i].created)\n                console.log(messages.items[i].text)\n                //If Spark message contains files, messages.items[i].files will be an array of URLs to the document(s) in that message\n                //Like in the Spark client, a user can only access file URLs for documents in rooms they are a member of\n                if (messages.items[i].files) {\n                    for (x=0;x\u003cmessages.items[i].files.length;x++) {\n                        fileURL = messages.items[i].files[x]\n                        console.log(fileURL)\n                    }\n                }\n            }\n             //support for pagination\n             sparkClient.listMessages(\"next\",function(err,messages){\n                // do something here\n             })\n    })\n```\n\n#### CiscoSparkClient.createMessage(personOrRoomId, messageText, \\[messageParams\\], callback)\nIf creating a message is successful, a response object will be returned containing the message parameters returned above for listMessages\n```javascript\n    messageParams = {}  // Message Parameters are optional\n    messageParams.file = 'https://web.ciscospark.com/images/logo_spark_256px.png'  // The file to attach to the message.  \n\n    //You can also directly upload a file by passing in a file buffer, in which case the returned Spark response will include the file ID. When directly uploading a file you must specify a filename.\n\n    var data = fs.readFileSync('document.xlsx');\n    messageParams.file = data\n    messageParams.filename = 'My uploaded file.xlsx'\n\n    //To set the type of your messageText to HTML or Markdown set messageParams.html messageParams.markdown to true.  If both are set, message will be sent as markdown.\n    //messageParams.html = true\n\n    // for a direct 1:1 message just use the users email address as the first parameter or person id\n    sparkClient.createMessage('marfeder@cisco.com', 'Hello!', messageParams, function(err, response) {\n        if (!err)\n            console.dir(response.id)\n    })\n\n    // or send to a room by using the room id as the first parameter\n    sparkClient.createMessage('Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2', 'Hello!', messageParams, function(err, response) {\n            if (!err)\n                console.dir(response.id)\n        })\n\n```\n\n#### CiscoSparkClient.getMessage(messageId, callback)\n```javascript\n    sparkClient.getMessage(\"Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjEzN2Y5YjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk\", function(err, message) {\n        if (!err) {\n            console.log(message.id)\n            console.log(message.roomId)\n            console.log(message.personId)\n            console.log(message.personEmail)\n            console.log(message.created)\n            console.log(message.text)\n            //If Spark message contains files, message.files will be an array of URLs to the document(s) in that message\n            //Like in the Spark client, a user can only access file URLs for documents in rooms they are a member of\n            if (message.files) {\n                for (x=0;x\u003cmessages.files.length;x++) {\n                    fileURL = messages.files[x]\n                    console.log(fileURL)\n                }\n            }\n        }\n   })\n```\n\n#### CiscoSparkClient.deleteMessage(messageId, callback)\n```javascript\n    sparkClient.deleteMessage(\"Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjEzN2Y5YjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk\", function(err, response) {\n        if (!err)\n            console.log(response.message)\n    })\n```\n\n#### CiscoSparkClient.getFile(fileURL, callback)\n```javascript\n    // Get fileInfo and fileData from a file URL returned by the getMessage function.  fileInfo is a JSON object containing the fileName, contentType, and contentLength in bits.  fileData is a buffer object containing the unencoded binary data.\n\tsparkClient.getFile(\"https://api.ciscospark.com/v1/contents/Y2lzY29zcGFyazovL3VzL0NPTlRFTlQvMDVmOGMwNDAtNDFiNy0xMmY1LTc0NDctOWM3ZTQ5M2U2MzJiLzA\", function (err, fileInfo, fileData) {\n    \tif (!err) {\n            console.log(fileInfo.fileName)\n            console.log(fileInfo.contentType)\n            console.log(fileInfo.contentLength)\n            path = './'+fileInfo.fileName\n            fs.writeFile(path,filedata, function(err){\n                if (err) throw err;\n                console.log('Saved file to '+path)\n            })\n        }\n    })\n```\n\n#### CiscoSparkClient.getFileInfo(fileURL, callback)\n```javascript\n    // To save bandwidth and performance, get information about a file without actually retrieving the file.  Requires a file URL returned by the getMessage function or from an inbound Webhook.  JSON object containing the fileName, contentType, and contentLength in bits.\n    sparkClient.getFileInfo(\"https://api.ciscospark.com/v1/contents/Y2lzY29zcGFyazovL3VzL0NPTlRFTlQvMDVmOGMwNDAtNDFiNy0xMmY1LTc0NDctOWM3ZTQ5M2U2MzJiLzA\", function (err, filename) \n    {\n    \tif (!err) {\n    \t\tconsole.log(fileInfo.fileName)\n            console.log(fileInfo.contentType)\n            console.log(fileInfo.contentLength)\n    \t}\n    })\n```\n\n---\n### People Functions\nPeople are registered users of the Spark application. Currently, people can only be searched with this API.\n#### CiscoSparkClient.listPeople(emailOrName, \\[maxResults\\], callback)\n```javascript\nsparkClient.listPeople(\"marcello\",2,function(err,people){\n     if (!err)\n          for (i=0;i\u003cpeople.items.length;i++) {\n            console.log(people.items[i].id)\n            console.log(people.items[i].emails)\n            console.log(people.items[i].displayName)\n            console.log(people.items[i].avatar)\n            console.log(people.items[i].created)\n\n          }\n\n        //support for pagination\n        sparkClient.listPeople(\"next\",function(err,people){\n           // do something here\n        })\n\n})\n```\n#### CiscoSparkClient.getPerson(personId, callback)\n```javascript\nsparkClient.getPerson(\"Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc\", function(err, person) {\n    if (!err) {\n         console.log(person.id)\n         console.log(person.emails)\n         console.log(person.displayName)\n         console.log(person.avatar)\n         console.log(person.created)\n    }\n})\n```\n#### CiscoSparkClient.getMe(callback)\n```javascript\nsparkClient.getMe(function(err, me) {\n    if (!err) {\n         console.log(me.id)\n         console.log(me.emails)\n         console.log(me.displayName)\n         console.log(me.avatar)\n         console.log(me.created)\n    }\n})\n```\n\n---\n### Membership Functions\nMemberships represent a person's relationship to a room. Use this API to list members of any room that you're in or create memberships to invite someone to a room. Memberships can also be updated to make someone a moderator or deleted to remove them from the room.\nJust like in the Spark app, you must be a member of the room in order to list its memberships or invite people.\n#### CiscoSparkClient.listMemberships(roomId, \\[queryParams\\], callback)\n```javascript\nqueryParams = {}  // Query Parameters are optional\nqueryParams.max = 10\n\n// refine the search by personId or personEmail\n// queryParams.personId = 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc'\n// queryParams.personEmail = 'marfeder@cisco.com'\n\nsparkClient.listMemberships(\"Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2\", queryParams, function(err, memberships) {\n    if (!err)\n        for (i=0;i\u003cmemberships.items.length;i++) {\n            console.log(memberships.items[i].id)\n            console.log(memberships.items[i].personId)\n            console.log(memberships.items[i].personEmail)\n            console.log(memberships.items[i].roomId)\n            console.log(memberships.items[i].isModerator)\n            console.log(memberships.items[i].isMonitor)\n            console.log(memberships.items[i].created)\n        }\n        //support for pagination\n        sparkClient.listMemberships(\"next\",function(err,memberships){\n           // do something here\n        })\n\n})\n```\n#### CiscoSparkClient.createMembership(roomId, emailOrId, isModerator, callback)\n```javascript\n\n// You can add a person to a room with only their email address\nsparkClient.createMessage(Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2,'marfeder@cisco.com', false, function(err, response) {\n    if (!err)\n        console.dir(response.message)\n})\n\n// or you can add a person to a room with their id\nsparkClient.createMessage('Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2', 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc', false, function(err, response) {\n     if (!err)\n        console.dir(response.message)\n})\n\n```\n#### CiscoSparkClient.getMembership(membershipId, callback)\n```javascript\n\nsparkClient.getMembership(\"Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng\", function(err, membership) {\n    if (!err) {\n         console.log(membership.id)\n         console.log(membership.personId)\n         console.log(membership.personEmail)\n         console.log(membership.roomId)\n         console.log(membership.isModerator)\n         console.log(membership.isMonitor)\n         console.log(membership.created)\n    }\n\n})\n```\n#### CiscoSparkClient.updateMembership(membershipId, isModerator, callback)\n```javascript\nsparkClient.updateMembership(\"Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng\", true, function(err, membership) {\n    if (!err)\n         console.log(membership.id)\n         console.log(membership.personId)\n         console.log(membership.personEmail)\n         console.log(membership.roomId)\n         console.log(membership.isModerator)\n         console.log(membership.isMonitor)\n         console.log(membership.created)\n})\n```\n#### CiscoSparkClient.deleteMembership(membershipId, callback)\n```javascript\nsparkClient.deleteRoom(\"Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng\", function(err, response) {\n    if (!err)\n        console.log(response.message)\n})\n```\n\n---\n### Team Functions\nTeams are groups of people with a set of rooms that are visible to all members of that team. This API is used to manage the teams themselves. Teams are created and deleted with this API. You can also update a team to change its team, for example.  Teams are by design \"moderated\" and the user creating a Team is automatically a moderator.  To administer a team through this API you must be a moderator of that team. \n\nTo manage people in a team, see the Team Membership API functions.  To manage team rooms, see the Room API functions.\n#### CiscoSparkClient.listTeams(maxTeams, callback)\n```javascript\n    sparkClient.listTeams(5, function(err, teams) {\n        if (!err) {\n            for (i=0;i\u003cteams.items.length;i++) {\n                console.log(teams.items[i].id)\n                console.log(teams.items[i].name)\n                console.log(teams.items[i].created)\n            }\n            //get the next 5 teams\n            sparkClient.listTeams(\"next\", function(err, teams) {\n                //do something else here\n                for (i=0;i\u003cteams.items.length;i++) {\n                    console.log(teams.items[i].id)\n                    console.log(teams.items[i].name)\n                    console.log(teams.items[i].created)\n                }\n            })\n        }\n    })\n```\n\n#### CiscoSparkClient.createTeam(name, callback)\n```javascript\n    sparkClient.createTeam(\"My New Team\", function(err, team) {\n        if (!err)\n            console.log(team.id)\n            console.log(team.name)\n            console.log(team.created)\n    })\n```\n\n#### CiscoSparkClient.updateTeam(teamId,name, callback)\n```javascript\n    sparkClient.updateTeam(\"Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5\", \"New Team Name\", function(err, team) {\n        if (!err)\n            console.log(team.id)\n            console.log(team.name)\n            console.log(team.created)\n    })\n```\n\n#### CiscoSparkClient.getTeam(teamId, callback)\n```javascript\n    sparkClient.getTeam(\"Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5\", function(err, team) {\n        if (!err)\n            console.log(team.id)\n            console.log(team.name)\n            console.log(team.created)\n    })\n```\n\n#### CiscoSparkClient.deleteTeam(teamId, callback)\n```javascript\n    sparkClient.deleteTeam(\"Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5\", function(err, response) {\n        if (!err)\n            console.log(response.message)\n    })\n```\n\n---\n### Team Membership Functions\nSimilarly to how room memberships function, users can also be members of a team. Use this API to list members of any team that you're in, or create memberships to add someone to a team. Memberships can also be updated to make someone a moderator or deleted to remove them from the team.\n\nJust like in the Spark app, you must be a member of the team in order to list its memberships or invite people.\n\n#### CiscoSparkClient.listTeamMemberships(teamId, \\[queryParams\\], callback)\n```javascript\n\n// Query Parameters are optional to refine the search or set max results\n// queryParams.max = 10\n\nqueryParams = {}  \nqueryParams.max = 5\n\nsparkClient.listTeamMemberships(\"Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5\",queryParams, function(err, teamMemberships) {\n    if (!err)\n        for (i=0;i\u003cteamMemberships.items.length;i++) {\n            console.log(teamMemberships.items[i].id)\n            console.log(teamMemberships.items[i].teamId)\n            console.log(teamMemberships.items[i].personId)\n            console.log(teamMemberships.items[i].personEmail)\n            console.log(teamMemberships.items[i].personDisplayName)\n            console.log(teamMemberships.items[i].isModerator)\n            console.log(teamMemberships.items[i].created)\n        }\n        //support for pagination\n        sparkClient.listTeamMemberships(\"next\",function(err,teamMemberships){\n            //Do something with next results\n            if (!err) {\n                for (i=0;i\u003cteamMemberships.items.length;i++) {\n                    \n                    console.log(teamMemberships.items[i].id)\n                    console.log(teamMemberships.items[i].personDisplayName)\n                }\n            }\n           \n        })\n\n})\n```\n#### CiscoSparkClient.createTeamMembership(roomId, emailOrId, isModerator, callback)\n```javascript\n\n//You can add a person to a team with only their email address\nsparkClient.createTeamMembership(\"Y2lzY29zcGFyazovL3VzL1RFQU0vZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1\",\"marfeder@ciscospark.com\", true, function(err, response) {\n    if (!err)\n        console.log(response.id)\n        console.log(response.teamId)\n        console.log(response.personId)\n        console.log(response.personEmail)\n        console.log(response.personDisplayName)\n        console.log(response.isModerator)\n        console.log(response.created)\n})\n\n// or you can add a person to a room with their id\nsparkClient.createTeamMembership(\"Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2\", \"Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc\", false, function(err, response) {\n     if (!err)\n        console.dir(response.message)\n})\n\n```\n#### CiscoSparkClient.getTeamMembership(membershipId, callback)\n```javascript\n//Get a specific Team Membership\nsparkClient.getTeamMembership(\"Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1\", function(err, membership) {\n    if (!err) {\n        console.log(membership.id)\n        console.log(membership.teamId)\n        console.log(membership.personId)\n        console.log(membership.personEmail)\n        console.log(membership.personDisplayName)\n        console.log(membership.isModerator)\n        console.log(membership.created)\n    }\n})\n```\n#### CiscoSparkClient.updateTeamMembership(membershipId, isModerator, callback)\n```javascript\n//Update a users team membership to set and/or remove moderator privileges\nsparkClient.updateTeamMembership(\"Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1\", false, function (err, membership) {\n    if (!err) {\n        console.log(membership.id)\n        console.log(membership.teamId)\n        console.log(membership.personId)\n        console.log(membership.personEmail)\n        console.log(membership.personDisplayName)\n        console.log(membership.isModerator)\n        console.log(membership.created)\n    }\n})\n```\n#### CiscoSparkClient.deleteTeamMembership(membershipId, callback)\n```javascript\n//Remove a user from a team\nsparkClient.deleteTeamMembership(\"Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1\", function(err, response) {\n    if (!err)\n        console.log(response.message)\n})\n```\n\n---\n### Webhook Functions\nWebhooks allow your app to be notified via HTTP when a specific event occurs on Spark. For example, your app can register a webhook to be notified when a new message is posted into a specific room.\nEvents trigger in near real-time allowing your app and backend IT systems to stay in sync with new content and room activity.\n#### CiscoSparkClient.listWebhooks(max, callback)\n```javascript\nsparkClient.listWebhooks(5, function(err, webhooks) {\n    if (!err)\n        for (i=0;i\u003cwebhooks.items.length;i++) {\n            console.log(webhooks.items[i].id)\n            console.log(webhooks.items[i].name)\n            console.log(webhooks.items[i].resource)\n            console.log(webhooks.items[i].event)\n            console.log(webhooks.items[i].targetUrl)\n            console.log(webhooks.items[i].filter)\n        }\n        //support for pagination\n        sparkClient.listWebhooks(\"next\",function(err,webhooks){\n           // do something here\n        })\n\n\n})\n```\n\n#### CiscoSparkClient.createWebhook(name, target, roomId, \\[webhookParams\\], callback)\n```javascript\nsparkClient.createWebhook(\"MyNewWebhook\", \"https://www.tpcal.me/post\", \"Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2\", function(err,webhook){\n       if (!err) {\n           console.log(webhook.id)\n           console.log(webhook.name)\n           console.log(webhook.resource)\n           console.log(webhook.event)\n           console.log(webhook.targetUrl)\n           console.log(webhook.filter)\n       }\n})\n```\n#### CiscoSparkClient.getWebhook(webhookId, callback)\n```javascript\nsparkClient.getWebhook(\"Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx\", function(err, webhook) {\n       if (!err) {\n           console.log(webhook.id)\n           console.log(webhook.name)\n           console.log(webhook.resource)\n           console.log(webhook.event)\n           console.log(webhook.targetUrl)\n           console.log(webhook.filter)\n       }\n})\n```\n#### CiscoSparkClient.updateWebhookfunction(webhookId, name, target, callback)\n```javascript\nsparkClient.updateWebhook(\"Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx\",\"NewName\",\"https://www.tpcall.me/newpost\", function(err, webhook) {\n       if (!err) {\n           console.log(webhook.id)\n           console.log(webhook.name)\n           console.log(webhook.resource)\n           console.log(webhook.event)\n           console.log(webhook.targetUrl)\n           console.log(webhook.filter)\n       }\n})\n```\n#### CiscoSparkClient.deleteWebhook(webhookId, callback)\n```javascript\nsparkClient.deleteWebhook(\"Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx\", function(err, response) {\n    if (!err)\n        console.log(response.message)\n})\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarchfederico%2Fnode-sparkclient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarchfederico%2Fnode-sparkclient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarchfederico%2Fnode-sparkclient/lists"}