node-sparkclient is node Cisco Spark module. It provides a simple way to work with the Cisco Spark APIs
npm install node-sparkclient
This module assumes you have received an access token from the Cisco Spark Oauth2 service.
All 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.
var sparkClient = new CiscoSparkClient('Kjc0YTA5MWUtZTJlYi00NzNhLWI2NGQtYzAxOGJkZjat27ZlMzZkY2U2OWQtNTdi')
Rooms are virtual meeting place where people post messages and collaborate to get work done. This API is used to manage the rooms themselves.
sparkClient.listRooms(10, function(err, rooms) {
if (!err) {
for (i=0;i<rooms.items.length;i++) {
console.log(rooms.items[i].id)
console.log(rooms.items[i].title)
console.log(rooms.items[i].created)
console.log(rooms.items[i].lastActivity)
}
//get the next 10 rooms
sparkClient.listRooms("next", function(err, rooms) {
//do something else here
for (i=0;i<rooms.items.length;i++) {
console.log(rooms.items[i].id)
console.log(rooms.items[i].title)
console.log(rooms.items[i].created)
console.log(rooms.items[i].lastActivity)
}
})
}
})
sparkClient.createRoom("My New Room", function(err, room) {
if (!err)
console.log(room.id)
console.log(room.title)
console.log(room.created)
})
sparkClient.updateRoom("Y2lzY29zcGFyazovL3VzL1JPT00vY2ZjNmY5NzAtYTAzNi0xMWU1LWJlOGYtODVmMTM2MmM4YWZk", "New Title", function(err, room) {
if (!err)
console.log(room.id)
console.log(room.title)
console.log(room.created)
})
sparkClient.getRoom("Y2lzY29zcGFyazovL3VzL1JPT00vNDAyNjRhZjAtOWVlYy0xMWU1LTkwOGEtODUyZTZhOGJlMTBh", function(err, room) {
if (!err)
console.log(room.id)
console.log(room.title)
console.log(room.created)
console.log(room.lastActivity)
})
sparkClient.deleteRoom("Y2lzY29zcGFyazovL3VzL1JPT00vNDAyNjRhZjAtOWVlYy0xMWU1LTkwOGEtODUyZTZhOGJlMTBh", function(err, response) {
if (!err)
console.log(response.message)
})
Messages 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.
queryParams = {} // Query Parameters are optional
queryParams.before = '2015-12-11T22:44:10.511Z'
queryParams.beforeMessage = 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjFjYjExZjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk'
queryParams.max = 10
sparkClient.listMessages("Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2", queryParams, function(err, messages) {
if (!err)
for (i=0;i<messages.items.length;i++) {
console.log(messages.items[i].id)
console.log(messages.items[i].roomId)
console.log(messages.items[i].personId)
console.log(messages.items[i].personEmail)
console.log(messages.items[i].created)
console.log(messages.items[i].text)
//If Spark message contains files, messages.items[i].files will be an array of URLs to the document(s) in that message
//Like in the Spark client, a user can only access file URLs for documents in rooms they are a member of
if (messages.items[i].files) {
for (x=0;x<messages.items[i].files.length;x++) {
fileURL = messages.items[i].files[x]
console.log(fileURL)
}
}
}
//support for pagination
sparkClient.listMessages("next",function(err,messages){
// do something here
})
})
If creating a message is successful, a response object will be returned containing the message parameters returned above for listMessages
messageParams = {} // Message Parameters are optional
messageParams.file = 'https://web.ciscospark.com/images/logo_spark_256px.png' // The file to attach to the message.
//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.
var data = fs.readFileSync('document.xlsx');
messageParams.file = data
messageParams.filename = 'My uploaded file.xlsx'
//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.
//messageParams.html = true
// for a direct 1:1 message just use the users email address as the first parameter or person id
sparkClient.createMessage('[email protected]', 'Hello!', messageParams, function(err, response) {
if (!err)
console.dir(response.id)
})
// or send to a room by using the room id as the first parameter
sparkClient.createMessage('Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2', 'Hello!', messageParams, function(err, response) {
if (!err)
console.dir(response.id)
})
sparkClient.getMessage("Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjEzN2Y5YjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk", function(err, message) {
if (!err) {
console.log(message.id)
console.log(message.roomId)
console.log(message.personId)
console.log(message.personEmail)
console.log(message.created)
console.log(message.text)
//If Spark message contains files, message.files will be an array of URLs to the document(s) in that message
//Like in the Spark client, a user can only access file URLs for documents in rooms they are a member of
if (message.files) {
for (x=0;x<messages.files.length;x++) {
fileURL = messages.files[x]
console.log(fileURL)
}
}
}
})
sparkClient.deleteMessage("Y2lzY29zcGFyazovL3VzL01FU1NBR0UvYjEzN2Y5YjAtYTA1OC0xMWU1LThjYTUtZjc1OTUwNjk2NzZk", function(err, response) {
if (!err)
console.log(response.message)
})
// 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.
sparkClient.getFile("https://api.ciscospark.com/v1/contents/Y2lzY29zcGFyazovL3VzL0NPTlRFTlQvMDVmOGMwNDAtNDFiNy0xMmY1LTc0NDctOWM3ZTQ5M2U2MzJiLzA", function (err, fileInfo, fileData) {
if (!err) {
console.log(fileInfo.fileName)
console.log(fileInfo.contentType)
console.log(fileInfo.contentLength)
path = './'+fileInfo.fileName
fs.writeFile(path,filedata, function(err){
if (err) throw err;
console.log('Saved file to '+path)
})
}
})
// 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.
sparkClient.getFileInfo("https://api.ciscospark.com/v1/contents/Y2lzY29zcGFyazovL3VzL0NPTlRFTlQvMDVmOGMwNDAtNDFiNy0xMmY1LTc0NDctOWM3ZTQ5M2U2MzJiLzA", function (err, filename)
{
if (!err) {
console.log(fileInfo.fileName)
console.log(fileInfo.contentType)
console.log(fileInfo.contentLength)
}
})
People are registered users of the Spark application. Currently, people can only be searched with this API.
sparkClient.listPeople("marcello",2,function(err,people){
if (!err)
for (i=0;i<people.items.length;i++) {
console.log(people.items[i].id)
console.log(people.items[i].emails)
console.log(people.items[i].displayName)
console.log(people.items[i].avatar)
console.log(people.items[i].created)
}
//support for pagination
sparkClient.listPeople("next",function(err,people){
// do something here
})
})
sparkClient.getPerson("Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc", function(err, person) {
if (!err) {
console.log(person.id)
console.log(person.emails)
console.log(person.displayName)
console.log(person.avatar)
console.log(person.created)
}
})
sparkClient.getMe(function(err, me) {
if (!err) {
console.log(me.id)
console.log(me.emails)
console.log(me.displayName)
console.log(me.avatar)
console.log(me.created)
}
})
Memberships 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. Just like in the Spark app, you must be a member of the room in order to list its memberships or invite people.
queryParams = {} // Query Parameters are optional
queryParams.max = 10
// refine the search by personId or personEmail
// queryParams.personId = 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc'
// queryParams.personEmail = '[email protected]'
sparkClient.listMemberships("Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2", queryParams, function(err, memberships) {
if (!err)
for (i=0;i<memberships.items.length;i++) {
console.log(memberships.items[i].id)
console.log(memberships.items[i].personId)
console.log(memberships.items[i].personEmail)
console.log(memberships.items[i].roomId)
console.log(memberships.items[i].isModerator)
console.log(memberships.items[i].isMonitor)
console.log(memberships.items[i].created)
}
//support for pagination
sparkClient.listMemberships("next",function(err,memberships){
// do something here
})
})
// You can add a person to a room with only their email address
sparkClient.createMessage(Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2,'[email protected]', false, function(err, response) {
if (!err)
console.dir(response.message)
})
// or you can add a person to a room with their id
sparkClient.createMessage('Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2', 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc', false, function(err, response) {
if (!err)
console.dir(response.message)
})
sparkClient.getMembership("Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng", function(err, membership) {
if (!err) {
console.log(membership.id)
console.log(membership.personId)
console.log(membership.personEmail)
console.log(membership.roomId)
console.log(membership.isModerator)
console.log(membership.isMonitor)
console.log(membership.created)
}
})
sparkClient.updateMembership("Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng", true, function(err, membership) {
if (!err)
console.log(membership.id)
console.log(membership.personId)
console.log(membership.personEmail)
console.log(membership.roomId)
console.log(membership.isModerator)
console.log(membership.isMonitor)
console.log(membership.created)
})
sparkClient.deleteRoom("Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvNzNmMDU4YmUtNTE0Yy00OTkwLWE5MmYtNDFjZWNjODVhYjM3OmY3MGY0NDgwLWEwNTctMTFlNS04ODE5LTgzZDgwOWQ2ZWY3Ng", function(err, response) {
if (!err)
console.log(response.message)
})
Teams 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.
To manage people in a team, see the Team Membership API functions. To manage team rooms, see the Room API functions.
sparkClient.listTeams(5, function(err, teams) {
if (!err) {
for (i=0;i<teams.items.length;i++) {
console.log(teams.items[i].id)
console.log(teams.items[i].name)
console.log(teams.items[i].created)
}
//get the next 5 teams
sparkClient.listTeams("next", function(err, teams) {
//do something else here
for (i=0;i<teams.items.length;i++) {
console.log(teams.items[i].id)
console.log(teams.items[i].name)
console.log(teams.items[i].created)
}
})
}
})
sparkClient.createTeam("My New Team", function(err, team) {
if (!err)
console.log(team.id)
console.log(team.name)
console.log(team.created)
})
sparkClient.updateTeam("Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5", "New Team Name", function(err, team) {
if (!err)
console.log(team.id)
console.log(team.name)
console.log(team.created)
})
sparkClient.getTeam("Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5", function(err, team) {
if (!err)
console.log(team.id)
console.log(team.name)
console.log(team.created)
})
sparkClient.deleteTeam("Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5", function(err, response) {
if (!err)
console.log(response.message)
})
Similarly 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.
Just like in the Spark app, you must be a member of the team in order to list its memberships or invite people.
// Query Parameters are optional to refine the search or set max results
// queryParams.max = 10
queryParams = {}
queryParams.max = 5
sparkClient.listTeamMemberships("Y2lzY29zcGFyazovL3VzL1RFQU0vMTIyY2dkYTEtNDMyOC0xMmU2LTlmYTgtNjE2NWNhMmNhNDU5",queryParams, function(err, teamMemberships) {
if (!err)
for (i=0;i<teamMemberships.items.length;i++) {
console.log(teamMemberships.items[i].id)
console.log(teamMemberships.items[i].teamId)
console.log(teamMemberships.items[i].personId)
console.log(teamMemberships.items[i].personEmail)
console.log(teamMemberships.items[i].personDisplayName)
console.log(teamMemberships.items[i].isModerator)
console.log(teamMemberships.items[i].created)
}
//support for pagination
sparkClient.listTeamMemberships("next",function(err,teamMemberships){
//Do something with next results
if (!err) {
for (i=0;i<teamMemberships.items.length;i++) {
console.log(teamMemberships.items[i].id)
console.log(teamMemberships.items[i].personDisplayName)
}
}
})
})
//You can add a person to a team with only their email address
sparkClient.createTeamMembership("Y2lzY29zcGFyazovL3VzL1RFQU0vZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1","[email protected]", true, function(err, response) {
if (!err)
console.log(response.id)
console.log(response.teamId)
console.log(response.personId)
console.log(response.personEmail)
console.log(response.personDisplayName)
console.log(response.isModerator)
console.log(response.created)
})
// or you can add a person to a room with their id
sparkClient.createTeamMembership("Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83M2YwNThiZS01MTRjLTQ5OTAtYTkyZi00MWNlY2M4NWFiMzc", false, function(err, response) {
if (!err)
console.dir(response.message)
})
//Get a specific Team Membership
sparkClient.getTeamMembership("Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1", function(err, membership) {
if (!err) {
console.log(membership.id)
console.log(membership.teamId)
console.log(membership.personId)
console.log(membership.personEmail)
console.log(membership.personDisplayName)
console.log(membership.isModerator)
console.log(membership.created)
}
})
//Update a users team membership to set and/or remove moderator privileges
sparkClient.updateTeamMembership("Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1", false, function (err, membership) {
if (!err) {
console.log(membership.id)
console.log(membership.teamId)
console.log(membership.personId)
console.log(membership.personEmail)
console.log(membership.personDisplayName)
console.log(membership.isModerator)
console.log(membership.created)
}
})
//Remove a user from a team
sparkClient.deleteTeamMembership("Y2lzY29zcGFyazovL3VzL1RFQU1fTUVNQkVSU0hJUC9kOTMyNGE3MS00MmQ3LTQyYjUtOGI3Zi03MWM1MTY3NTY2ZWY6ZWE3MjdmMTAtNTQ1ZS0xMWU2LTljMjAtZjc2N2Y3ZTY3ZGE1", function(err, response) {
if (!err)
console.log(response.message)
})
Webhooks 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. Events trigger in near real-time allowing your app and backend IT systems to stay in sync with new content and room activity.
sparkClient.listWebhooks(5, function(err, webhooks) {
if (!err)
for (i=0;i<webhooks.items.length;i++) {
console.log(webhooks.items[i].id)
console.log(webhooks.items[i].name)
console.log(webhooks.items[i].resource)
console.log(webhooks.items[i].event)
console.log(webhooks.items[i].targetUrl)
console.log(webhooks.items[i].filter)
}
//support for pagination
sparkClient.listWebhooks("next",function(err,webhooks){
// do something here
})
})
sparkClient.createWebhook("MyNewWebhook", "https://www.tpcal.me/post", "Y2lzY29zcGFyazovL3VzL1JPT00vZjcwZjQ0ODAtYTA1Ny0xMWU1LTg4MTktODNkODA5ZDZlZjc2", function(err,webhook){
if (!err) {
console.log(webhook.id)
console.log(webhook.name)
console.log(webhook.resource)
console.log(webhook.event)
console.log(webhook.targetUrl)
console.log(webhook.filter)
}
})
sparkClient.getWebhook("Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx", function(err, webhook) {
if (!err) {
console.log(webhook.id)
console.log(webhook.name)
console.log(webhook.resource)
console.log(webhook.event)
console.log(webhook.targetUrl)
console.log(webhook.filter)
}
})
sparkClient.updateWebhook("Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx","NewName","https://www.tpcall.me/newpost", function(err, webhook) {
if (!err) {
console.log(webhook.id)
console.log(webhook.name)
console.log(webhook.resource)
console.log(webhook.event)
console.log(webhook.targetUrl)
console.log(webhook.filter)
}
})
sparkClient.deleteWebhook("Y2lzY29zcGFyazovL3VzL1dFQkhPT0svNDY3ODBhMTUtNTg1Yy00OWQ1LTkyOGYtZWRhMDEwZDIwNzcx", function(err, response) {
if (!err)
console.log(response.message)
})