node package manager


Slack API client written in JS

![Apache 2.0]( 2.0-blue.svg)

Slack Web and RTM API client. 🌱🙌💕

  • Written in ES2015 JS, published as ES5, tested for Node and the browser
  • Web API is all pure functions (no stateful things like classes or using new)
  • RTM API has a thin wrapper for WebSocket (also tested for Node and the browser!)
  • Perfect symmetry (low level: method signatures match API docs method signatures are node-style callbacks)
  • Opt in (selectively use the parts of the api surface you want without the entire payload)
  • Well tested, CI, and Apache2 licensed
npm i slack

Usage ✨🚀

slack is tested for Node and the browser.

var slack = require('slack')
// logs {args:{hello:'world'}} 
slack.api.test({hello:'world'}, console.log)

Usage with ES2015 works well too; slack itself is written with Babel. You can also specify only the methods you need which can trim the payload if you are using slack in the browser.

// only import the specific method you need 
import test from 'slack/methods/api.test'
// logs {args:{hyper:'card'}} 
test({hyper:'card'}, console.log)

Starting an RTM session:

import slack from 'slack'
let bot = slack.rtm.client()
let token = process.env.SLACK_TOKEN
bot.hello(message=> {
  console.log(`Got a message: ${message}`)

The entire RTM event API is supported.

Clone this repo and create a file called .env in the root with the following:


You can get a SLACK_TOKEN for testing here. You need to register an app for a SLACK_CLIENT_ID and SLACK_CLIENT_SECRET.

👉 In Node:

npm test

👉 Or the browser:

npm run btest

👉 Or kick up a REPL and poke around:


Slack Web API 🎉🐝🚩

The entire Slack Web API is supported. All method signatures accept a params object and Node style callback. Required params are documented inline below.

  • slack.api.test({}, (err, data)=>)
  • slack.auth.test({token}, (err, data)=>)
  • slack.channels.archive({token, channel}, (err, data)=>)
  • slack.channels.create({token, name}, (err, data)=>)
  • slack.channels.history({token, channel}, (err, data)=>)
  •{token, channel}, (err, data)=>)
  • slack.channels.invite({token, channel, user}, (err, data)=>)
  • slack.channels.join({token, name}, (err, data)=>)
  • slack.channels.kick({token, channel, user}, (err, data)=>)
  • slack.channels.leave({token, channel}, (err, data)=>)
  • slack.channels.list({token}, (err, data)=>)
  • slack.channels.mark({token, channel, ts}, (err, data)=>)
  • slack.channels.rename({token, channel, name}, (err, data)=>)
  • slack.channels.setPurpose({token, channel, purpose}, (err, data)=>)
  • slack.channels.setTopic({token, channel, topic}, (err, data)=>)
  • slack.channels.unarchive({token, channel}, (err, data)=>)
  •{token, ts, channel}, (err, data)=>)
  •{token, channel, text}, (err, data)=>)
  •{token, ts, channel, text}, (err, data)=>)
  • slack.dnd.endDnd({token}, (err, data)=>)
  • slack.dnd.endSnooze({token}, (err, data)=>)
  •{token}, (err, data)=>)
  • slack.dnd.setSnooze({token, num_minutes}, (err, data)=>)
  • slack.dnd.teamInfo({token}, (err, data)=>)
  • slack.emoji.list({token}, (err, data)=>)
  • slack.files.delete({token, file}, (err, data)=>)
  •{token, file}, (err, data)=>)
  • slack.files.list({token}, (err, data)=>)
  • slack.files.upload({token, file, filename}, (err, data)=>)
  • slack.groups.archive({token, channel}, (err, data)=>)
  • slack.groups.close({token, channel}, (err, data)=>)
  • slack.groups.create({token, name}, (err, data)=>)
  • slack.groups.createChild({token, channel}, (err, data)=>)
  • slack.groups.history({token, channel}, (err, data)=>)
  •{token, channel}, (err, data)=>)
  • slack.groups.invite({token, channel, user}, (err, data)=>)
  • slack.groups.kick({token, channel, user}, (err, data)=>)
  • slack.groups.leave({token, channel}, (err, data)=>)
  • slack.groups.list({token}, (err, data)=>)
  • slack.groups.mark({token, channel, ts}, (err, data)=>)
  •{token, channel}, (err, data)=>)
  • slack.groups.rename({token, channel, name}, (err, data)=>)
  • slack.groups.setPurpose({token, channel, purpose}, (err, data)=>)
  • slack.groups.setTopic({token, channel, topic}, (err, data)=>)
  • slack.groups.unarchive({token, channel}, (err, data)=>)
  •{token, channel}, (err, data)=>)
  •{token, channel}, (err, data)=>)
  •{token}, (err, data)=>)
  •{token, channel, ts}, (err, data)=>)
  •{token, user}, (err, data)=>)
  • slack.mpim.close({token, channel}, (err, data)=>)
  • slack.mpim.history({token, channel}, (err, data)=>)
  • slack.mpim.list({token}, (err, data)=>)
  • slack.mpim.mark({token, channel, ts}, (err, data)=>)
  •{token, users}, (err, data)=>)
  • slack.oauth.access({client_id, client_secret, code}, (err, data)=>)
  • slack.pins.add({token, channel}, (err, data)=>)
  • slack.pins.list({token, channel}, (err, data)=>)
  • slack.pins.remove({token, channel}, (err, data)=>)
  • slack.reactions.add({token, name}, (err, data)=>)
  • slack.reactions.get({token}, (err, data)=>)
  • slack.reactions.list({token}, (err, data)=>)
  • slack.reactions.remove({token, name}, (err, data)=>)
  • slack.rtm.start({token}, (err, data)=>)
  •{token, query}, (err, data)=>)
  •{token, query}, (err, data)=>)
  •{token, query}, (err, data)=>)
  • slack.stars.add({token}, (err, data)=>)
  • slack.stars.list({token}, (err, data)=>)
  • slack.stars.remove({token}, (err, data)=>)
  •{token}, (err, data)=>)
  •{token}, (err, data)=>)
  •{token}, (err, data)=>)
  • slack.usergroups.create({token, name}, (err, data)=>)
  • slack.usergroups.disable({token, usergroup}, (err, data)=>)
  • slack.usergroups.enable({token, usergroup}, (err, data)=>)
  • slack.usergroups.list({token}, (err, data)=>)
  • slack.usergroups.update({token, usergroup}, (err, data)=>)
  • slack.usergroups.users.list({token, usergroup}, (err, data)=>)
  • slack.usergroups.users.update({token, usergroup, users}, (err, data)=>)
  • slack.users.getPresence({token, user}, (err, data)=>)
  •{token, user}, (err, data)=>)
  • slack.users.list({token}, (err, data)=>)
  • slack.users.setActive({token}, (err, data)=>)
  • slack.users.setPresence({token, presence}, (err, data)=>)


slack.rtm.client() is a factory method that returns an thinly wrapped WebSocket instance with helpers for registering callbacks to Slack RTM events.

var slack = require('slack')
var bot = slack.rtm.client()
var token = process.env.SLACK_TOKEN
// logs: ws, started, close, listen, etc... in addition to the RTM event handler methods 
// do something with the rtm.start payload 
bot.started(function(payload) {
  console.log('payload from rtm.start', payload)
// respond to a user_typing message 
bot.user_typing(function(msg) {
  console.log('several people are coding', msg)
// start listening to the slack team associated to the token 

Try it out by running npm start:

  • is a WebSocket instance constructed from slack/methods/rtm.start payload
  • bot.started(payload=>) fires after rtm.start payload response is received and socket established
  • bot.close() closes the WebSocket
  • bot.listen({token}) initiates the slack/methods/rtm.start handshake and delegates all messages

Each of these are methods on bot for registering handlers for the events of the same name.

  • hello
  • message
  • user_typing
  • channel_marked
  • channel_created
  • channel_joined
  • channel_left
  • channel_deleted
  • channel_rename
  • channel_archive
  • channel_unarchive
  • channel_history_changed
  • im_created
  • im_open
  • im_close
  • im_marked
  • im_history_changed
  • group_joined
  • group_left
  • group_open
  • group_close
  • group_archive
  • group_unarchive
  • group_rename
  • group_marked
  • group_history_changed
  • file_created
  • file_shared
  • file_unshared
  • file_public
  • file_private
  • file_change
  • file_deleted
  • file_comment_added
  • file_comment_edited
  • file_comment_deleted
  • pin_added
  • pin_removed
  • presence_change
  • manual_presence_change
  • pref_change
  • user_change
  • team_join
  • star_added
  • star_removed
  • reaction_added
  • reaction_removed
  • emoji_changed
  • commands_changed
  • team_plan_change
  • team_pref_change
  • team_rename
  • team_domain_change
  • email_domain_changed
  • bot_added
  • bot_changed
  • accounts_changed
  • team_migration_started
  • subteam_created
  • subteam_updated
  • subteam_self_added
  • subteam_self_removed