{"id":13438850,"url":"https://github.com/beginner-corp/slack","last_synced_at":"2025-03-20T06:31:36.836Z","repository":{"id":42366960,"uuid":"47720002","full_name":"beginner-corp/slack","owner":"beginner-corp","description":":tada:✨ Slack API client for Node and browsers.","archived":true,"fork":false,"pushed_at":"2022-04-08T16:45:25.000Z","size":1155,"stargazers_count":925,"open_issues_count":0,"forks_count":105,"subscribers_count":18,"default_branch":"master","last_synced_at":"2024-04-10T10:18:44.411Z","etag":null,"topics":["api","api-client","api-wrapper","browser","javascript","js","node","nodejs","slack"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/slack","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beginner-corp.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-09T21:28:05.000Z","updated_at":"2024-02-22T20:26:00.000Z","dependencies_parsed_at":"2022-09-13T02:52:37.254Z","dependency_job_id":null,"html_url":"https://github.com/beginner-corp/slack","commit_stats":null,"previous_names":["smallwins/slack"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beginner-corp%2Fslack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beginner-corp%2Fslack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beginner-corp%2Fslack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beginner-corp%2Fslack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beginner-corp","download_url":"https://codeload.github.com/beginner-corp/slack/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243769178,"owners_count":20345195,"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":["api","api-client","api-wrapper","browser","javascript","js","node","nodejs","slack"],"created_at":"2024-07-31T03:01:08.966Z","updated_at":"2025-03-20T06:31:31.828Z","avatar_url":"https://github.com/beginner-corp.png","language":"JavaScript","readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg width=\"333px\" src=https://s3-us-west-1.amazonaws.com/bugbot/slack-js.svg alt=slack title=slack width=178\u003e\n\u003c/h1\u003e\n\u003cp align=\"center\" style=\"font-size: 1.2rem;\"\u003e\n  \u003ca href=https://www.npmjs.com/package/slack\u003e\u003cimg alt=npm src=https://badge.fury.io/js/slack.svg\u003e\u003c/a\u003e\n  \u003ca href=https://github.com/smallwins/slack/actions?query=workflow%3A%22Node+CI%22\u003e\u003cimg alt=\"Node CI\" src=https://github.com/smallwins/slack/workflows/Node%20CI/badge.svg\u003e\u003c/a\u003e\n  \u003cimg alt=\"coverage 93.85%\" src=https://img.shields.io/badge/coverage-93.85%25-brightgreen.svg\u003e\n\u003c/p\u003e\n\n### A [Slack Web API](https://api.slack.com/methods) client :seedling::raised_hands::two_hearts:\n\n- Written in modern JavaScript; tested for Node and the browser\n- Complete support for the [Slack Web API](https://api.slack.com/methods)\n- Perfect symmetry: JS method signatures match Web API docs\n- Choose your async adventure: all methods accept either a Node style errback or return a `Promise`\n- Opt into an OO style class instance that applies `token` to all methods\n- Well tested, CI, and Apache2 licensed\n- Only one dependency: `tiny-json-http`\n- Tiny: **7kb** browserified/minified\n\n## Install :star2::package:\n\n```\nnpm i slack\n```\n\n# Usage :sparkles::rocket:\n\n`slack` mirrors the published API docs exactly because its generated from those docs! The default interface are stateless functions and has remain unchanged since `1.0.0` and that will continue to be the case.\n\n```javascript\nvar slack = require('slack')\n\n// logs {args:{hello:'world'}}\nslack.api.test({hello:'world'}, console.log)\n\n// :new: opt into promises\nslack.api.test({nice:1}).then(console.log).catch(console.log)\n```\n\nDue to popular demand an OO style is supported. For an instance of `Slack` all methods come prebound with the `token` parameter applied.\n\n```javascript\nconst token = process.env.SLACK_BOT_TOKEN\nconst Slack = require('slack')\nconst bot = new Slack({token})\n\n// logs {args:{hyper:'card'}}\nbot.api.test({hyper:'card'}).then(console.log)\n```\n\nUsing `async`/`await` in Node 8.x:\n\n```javascript\nlet token = process.env.SLACK_BOT_TOKEN\nlet Slack = require('slack')\nlet bot = new Slack({token})\n\n;(async function main() {\n  // logs {args:{hyper:'card'}}\n  var result = await bot.api.test({hyper:'card'})\n  console.log(result)\n})()\n```\n\nChoose whichever style works best for your project deployment needs and team preference. :hearts::beer:\n\n### Error Handling\n\nSome methods (like [`slack.dialog.open`](https://api.slack.com/methods/dialog.open)) provide additional context for errors through a `response_metadata` object. This will be exposed as a `messages` properties on the errors that are thrown.\n\n```javascript\nslack.dialog.open(options).catch(err =\u003e {\n  console.log(err.messages)\n})\n```\n\n### Specialized Electron Support\n\nElectron ships its own HTTP module called `electron.net` which can have better performance and offers more extensive HTTP proxy handling. You can opt into Electron support by passing `useElectronNet:true` to the `Slack` constructor.\n\n```javascript\nimport {app, BrowserWindow, net} from 'electron'\nimport Slack from 'slack'\n\nconst slack = new Slack({useElectronNet:true})\n```\n\nYou can setup an HTTP authentication proxy logic by passing `login` to the constructor.\n\n```javascript\nfunction login(authInfo, callback) {\n  callback('username', 'password')\n}\n\nconst slack = new Slack({useElectronNet:true, login})\n```\n\n[Read more about `electron.net` from the source!](https://github.com/electron/electron/blob/master/docs/api/net.md)\n\n### Test Setup :lock::key::point_left:\n\nClone this repo and create a file called `.env` in the root with the following:\n\n```\nSLACK_BOT_TOKEN=xxxx\nSLACK_CLIENT_ID=xxxx\nSLACK_CLIENT_SECRET=xxxx\n```\n\nYou can get a `SLACK_TOKEN` for testing [here](https://api.slack.com/web). You need to register an app for a `SLACK_CLIENT_ID` and `SLACK_CLIENT_SECRET`. The tests require the app to have the following scopes, and for the target slack to have a `#test` channel:\n\n- `channels:history`\n- `channels:read`\n- `chat:write:bot`\n- `team:read`\n- `users:read`\n\nYou can [read about bot tokens here](https://api.slack.com/docs/token-types#bot).\n\n\n## Testing :green_heart::green_heart::green_heart:\n\n:point_right: In Node:\n\n```\nnpm test\n```\n\n:point_right: Or the browser:\n\n```\nnpm run btest\n```\n\n# Slack Web API :tada::honeybee::triangular_flag_on_post:\n\nThe entire Slack Web API is supported. All method signatures accept a `params` object and either a Node style callback (an errback) or, if absent, it will return a `Promise`. Required params are documented inline below.\n\n- [`slack.api.test({})`](https://api.slack.com/methods/api.test)\n- [`slack.apps.permissions.info({token})`](https://api.slack.com/methods/apps.permissions.info)\n- [`slack.apps.permissions.request({token, scopes, trigger_id})`](https://api.slack.com/methods/apps.permissions.request)\n- [`slack.apps.permissions.resources.list({token})`](https://api.slack.com/methods/apps.permissions.resources.list)\n- [`slack.apps.permissions.scopes.list({token})`](https://api.slack.com/methods/apps.permissions.scopes.list)\n- [`slack.apps.permissions.users.list({token})`](https://api.slack.com/methods/apps.permissions.users.list)\n- [`slack.apps.permissions.users.request({token, scopes, trigger_id, user})`](https://api.slack.com/methods/apps.permissions.users.request)\n- [`slack.apps.uninstall({token, client_id, client_secret})`](https://api.slack.com/methods/apps.uninstall)\n- [`slack.auth.revoke({token})`](https://api.slack.com/methods/auth.revoke)\n- [`slack.auth.test({token})`](https://api.slack.com/methods/auth.test)\n- [`slack.bots.info({token})`](https://api.slack.com/methods/bots.info)\n- [`slack.channels.archive({token, channel})`](https://api.slack.com/methods/channels.archive)\n- [`slack.channels.create({token, name})`](https://api.slack.com/methods/channels.create)\n- [`slack.channels.history({token, channel})`](https://api.slack.com/methods/channels.history)\n- [`slack.channels.info({token, channel})`](https://api.slack.com/methods/channels.info)\n- [`slack.channels.invite({token, channel, user})`](https://api.slack.com/methods/channels.invite)\n- [`slack.channels.join({token, name})`](https://api.slack.com/methods/channels.join)\n- [`slack.channels.kick({token, channel, user})`](https://api.slack.com/methods/channels.kick)\n- [`slack.channels.leave({token, channel})`](https://api.slack.com/methods/channels.leave)\n- [`slack.channels.list({token})`](https://api.slack.com/methods/channels.list)\n- [`slack.channels.mark({token, channel, ts})`](https://api.slack.com/methods/channels.mark)\n- [`slack.channels.rename({token, channel, name})`](https://api.slack.com/methods/channels.rename)\n- [`slack.channels.replies({token, channel, thread_ts})`](https://api.slack.com/methods/channels.replies)\n- [`slack.channels.setPurpose({token, channel, purpose})`](https://api.slack.com/methods/channels.setPurpose)\n- [`slack.channels.setTopic({token, channel, topic})`](https://api.slack.com/methods/channels.setTopic)\n- [`slack.channels.unarchive({token, channel})`](https://api.slack.com/methods/channels.unarchive)\n- [`slack.chat.delete({token, channel, ts})`](https://api.slack.com/methods/chat.delete)\n- [`slack.chat.getPermalink({token, channel, message_ts})`](https://api.slack.com/methods/chat.getPermalink)\n- [`slack.chat.meMessage({token, channel, text})`](https://api.slack.com/methods/chat.meMessage)\n- [`slack.chat.postEphemeral({token, channel, text, user})`](https://api.slack.com/methods/chat.postEphemeral)\n- [`slack.chat.postMessage({token, channel, text})`](https://api.slack.com/methods/chat.postMessage)\n- [`slack.chat.unfurl({token, channel, ts, unfurls})`](https://api.slack.com/methods/chat.unfurl)\n- [`slack.chat.update({token, channel, text, ts})`](https://api.slack.com/methods/chat.update)\n- [`slack.conversations.archive({token, channel})`](https://api.slack.com/methods/conversations.archive)\n- [`slack.conversations.close({token, channel})`](https://api.slack.com/methods/conversations.close)\n- [`slack.conversations.create({token, name})`](https://api.slack.com/methods/conversations.create)\n- [`slack.conversations.history({token, channel})`](https://api.slack.com/methods/conversations.history)\n- [`slack.conversations.info({token, channel})`](https://api.slack.com/methods/conversations.info)\n- [`slack.conversations.invite({token, channel, users})`](https://api.slack.com/methods/conversations.invite)\n- [`slack.conversations.join({token, channel})`](https://api.slack.com/methods/conversations.join)\n- [`slack.conversations.kick({token, channel, user})`](https://api.slack.com/methods/conversations.kick)\n- [`slack.conversations.leave({token, channel})`](https://api.slack.com/methods/conversations.leave)\n- [`slack.conversations.list({token})`](https://api.slack.com/methods/conversations.list)\n- [`slack.conversations.members({token, channel})`](https://api.slack.com/methods/conversations.members)\n- [`slack.conversations.open({token})`](https://api.slack.com/methods/conversations.open)\n- [`slack.conversations.rename({token, channel, name})`](https://api.slack.com/methods/conversations.rename)\n- [`slack.conversations.replies({token, channel, ts})`](https://api.slack.com/methods/conversations.replies)\n- [`slack.conversations.setPurpose({token, channel, purpose})`](https://api.slack.com/methods/conversations.setPurpose)\n- [`slack.conversations.setTopic({token, channel, topic})`](https://api.slack.com/methods/conversations.setTopic)\n- [`slack.conversations.unarchive({token, channel})`](https://api.slack.com/methods/conversations.unarchive)\n- [`slack.dialog.open({token, dialog, trigger_id})`](https://api.slack.com/methods/dialog.open)\n- [`slack.dnd.endDnd({token})`](https://api.slack.com/methods/dnd.endDnd)\n- [`slack.dnd.endSnooze({token})`](https://api.slack.com/methods/dnd.endSnooze)\n- [`slack.dnd.info({token})`](https://api.slack.com/methods/dnd.info)\n- [`slack.dnd.setSnooze({token, num_minutes})`](https://api.slack.com/methods/dnd.setSnooze)\n- [`slack.dnd.teamInfo({token})`](https://api.slack.com/methods/dnd.teamInfo)\n- [`slack.emoji.list({token})`](https://api.slack.com/methods/emoji.list)\n- [`slack.files.comments.add({token, comment, file})`](https://api.slack.com/methods/files.comments.add)\n- [`slack.files.comments.delete({token, file, id})`](https://api.slack.com/methods/files.comments.delete)\n- [`slack.files.comments.edit({token, comment, file, id})`](https://api.slack.com/methods/files.comments.edit)\n- [`slack.files.delete({token, file})`](https://api.slack.com/methods/files.delete)\n- [`slack.files.info({token, file})`](https://api.slack.com/methods/files.info)\n- [`slack.files.list({token})`](https://api.slack.com/methods/files.list)\n- [`slack.files.revokePublicURL({token, file})`](https://api.slack.com/methods/files.revokePublicURL)\n- [`slack.files.sharedPublicURL({token, file})`](https://api.slack.com/methods/files.sharedPublicURL)\n- [`slack.files.upload({token})`](https://api.slack.com/methods/files.upload)\n- [`slack.groups.archive({token, channel})`](https://api.slack.com/methods/groups.archive)\n- [`slack.groups.create({token, name})`](https://api.slack.com/methods/groups.create)\n- [`slack.groups.createChild({token, channel})`](https://api.slack.com/methods/groups.createChild)\n- [`slack.groups.history({token, channel})`](https://api.slack.com/methods/groups.history)\n- [`slack.groups.info({token, channel})`](https://api.slack.com/methods/groups.info)\n- [`slack.groups.invite({token, channel, user})`](https://api.slack.com/methods/groups.invite)\n- [`slack.groups.kick({token, channel, user})`](https://api.slack.com/methods/groups.kick)\n- [`slack.groups.leave({token, channel})`](https://api.slack.com/methods/groups.leave)\n- [`slack.groups.list({token})`](https://api.slack.com/methods/groups.list)\n- [`slack.groups.mark({token, channel, ts})`](https://api.slack.com/methods/groups.mark)\n- [`slack.groups.open({token, channel})`](https://api.slack.com/methods/groups.open)\n- [`slack.groups.rename({token, channel, name})`](https://api.slack.com/methods/groups.rename)\n- [`slack.groups.replies({token, channel, thread_ts})`](https://api.slack.com/methods/groups.replies)\n- [`slack.groups.setPurpose({token, channel, purpose})`](https://api.slack.com/methods/groups.setPurpose)\n- [`slack.groups.setTopic({token, channel, topic})`](https://api.slack.com/methods/groups.setTopic)\n- [`slack.groups.unarchive({token, channel})`](https://api.slack.com/methods/groups.unarchive)\n- [`slack.im.close({token, channel})`](https://api.slack.com/methods/im.close)\n- [`slack.im.history({token, channel})`](https://api.slack.com/methods/im.history)\n- [`slack.im.list({token})`](https://api.slack.com/methods/im.list)\n- [`slack.im.mark({token, channel, ts})`](https://api.slack.com/methods/im.mark)\n- [`slack.im.open({token, user})`](https://api.slack.com/methods/im.open)\n- [`slack.im.replies({token, channel, thread_ts})`](https://api.slack.com/methods/im.replies)\n- [`slack.migration.exchange({token, users})`](https://api.slack.com/methods/migration.exchange)\n- [`slack.mpim.close({token, channel})`](https://api.slack.com/methods/mpim.close)\n- [`slack.mpim.history({token, channel})`](https://api.slack.com/methods/mpim.history)\n- [`slack.mpim.list({token})`](https://api.slack.com/methods/mpim.list)\n- [`slack.mpim.mark({token, channel, ts})`](https://api.slack.com/methods/mpim.mark)\n- [`slack.mpim.open({token, users})`](https://api.slack.com/methods/mpim.open)\n- [`slack.mpim.replies({token, channel, thread_ts})`](https://api.slack.com/methods/mpim.replies)\n- [`slack.oauth.access({client_id, client_secret, code})`](https://api.slack.com/methods/oauth.access)\n- [`slack.oauth.token({client_id, client_secret, code})`](https://api.slack.com/methods/oauth.token)\n- [`slack.pins.add({token, channel})`](https://api.slack.com/methods/pins.add)\n- [`slack.pins.list({token, channel})`](https://api.slack.com/methods/pins.list)\n- [`slack.pins.remove({token, channel})`](https://api.slack.com/methods/pins.remove)\n- [`slack.reactions.add({token, name})`](https://api.slack.com/methods/reactions.add)\n- [`slack.reactions.get({token})`](https://api.slack.com/methods/reactions.get)\n- [`slack.reactions.list({token})`](https://api.slack.com/methods/reactions.list)\n- [`slack.reactions.remove({token, name})`](https://api.slack.com/methods/reactions.remove)\n- [`slack.reminders.add({token, text, time})`](https://api.slack.com/methods/reminders.add)\n- [`slack.reminders.complete({token, reminder})`](https://api.slack.com/methods/reminders.complete)\n- [`slack.reminders.delete({token, reminder})`](https://api.slack.com/methods/reminders.delete)\n- [`slack.reminders.info({token, reminder})`](https://api.slack.com/methods/reminders.info)\n- [`slack.reminders.list({token})`](https://api.slack.com/methods/reminders.list)\n- [`slack.rtm.connect({token})`](https://api.slack.com/methods/rtm.connect)\n- [`slack.rtm.start({token})`](https://api.slack.com/methods/rtm.start)\n- [`slack.search.all({token, query})`](https://api.slack.com/methods/search.all)\n- [`slack.search.files({token, query})`](https://api.slack.com/methods/search.files)\n- [`slack.search.messages({token, query})`](https://api.slack.com/methods/search.messages)\n- [`slack.stars.add({token})`](https://api.slack.com/methods/stars.add)\n- [`slack.stars.list({token})`](https://api.slack.com/methods/stars.list)\n- [`slack.stars.remove({token})`](https://api.slack.com/methods/stars.remove)\n- [`slack.team.accessLogs({token})`](https://api.slack.com/methods/team.accessLogs)\n- [`slack.team.billableInfo({token})`](https://api.slack.com/methods/team.billableInfo)\n- [`slack.team.info({token})`](https://api.slack.com/methods/team.info)\n- [`slack.team.integrationLogs({token})`](https://api.slack.com/methods/team.integrationLogs)\n- [`slack.team.profile.get({token})`](https://api.slack.com/methods/team.profile.get)\n- [`slack.usergroups.create({token, name})`](https://api.slack.com/methods/usergroups.create)\n- [`slack.usergroups.disable({token, usergroup})`](https://api.slack.com/methods/usergroups.disable)\n- [`slack.usergroups.enable({token, usergroup})`](https://api.slack.com/methods/usergroups.enable)\n- [`slack.usergroups.list({token})`](https://api.slack.com/methods/usergroups.list)\n- [`slack.usergroups.update({token, usergroup})`](https://api.slack.com/methods/usergroups.update)\n- [`slack.usergroups.users.list({token, usergroup})`](https://api.slack.com/methods/usergroups.users.list)\n- [`slack.usergroups.users.update({token, usergroup, users})`](https://api.slack.com/methods/usergroups.users.update)\n- [`slack.users.conversations({token})`](https://api.slack.com/methods/users.conversations)\n- [`slack.users.deletePhoto({token})`](https://api.slack.com/methods/users.deletePhoto)\n- [`slack.users.getPresence({token, user})`](https://api.slack.com/methods/users.getPresence)\n- [`slack.users.identity({token})`](https://api.slack.com/methods/users.identity)\n- [`slack.users.info({token, user})`](https://api.slack.com/methods/users.info)\n- [`slack.users.list({token})`](https://api.slack.com/methods/users.list)\n- [`slack.users.lookupByEmail({token, email})`](https://api.slack.com/methods/users.lookupByEmail)\n- [`slack.users.profile.get({token})`](https://api.slack.com/methods/users.profile.get)\n- [`slack.users.profile.set({token})`](https://api.slack.com/methods/users.profile.set)\n- [`slack.users.setActive({token})`](https://api.slack.com/methods/users.setActive)\n- [`slack.users.setPhoto({token, image})`](https://api.slack.com/methods/users.setPhoto)\n- [`slack.users.setPresence({token, presence})`](https://api.slack.com/methods/users.setPresence)\n\n# Contributing\n\nThe code for the client is generated by scraping the [Slack Web API documentation](https://api.slack.com/methods).\nRegenerate from the latest Slack documentation by running :runner::\n\n```\nnpm run generate\n```\n\nPortions of this README are generated as well; to make edits, update `readme.tmpl`\nand run the same command :cloud::umbrella::sunny::sunflower:.\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeginner-corp%2Fslack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeginner-corp%2Fslack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeginner-corp%2Fslack/lists"}