Slack API
Fully stateful Slack Web API emulation with channels, messages, threads, reactions, user profiles, presence, modern file uploads, pins, bookmarks, views, OAuth v2, and incoming webhooks. Chat writes preserve common rich message fields such as blocks, attachments, metadata, formatting flags, unfurl flags, and client message ids. Conversation writes update archive state, names, topics, purposes, membership, DMs, MPIMs, and read cursors. User writes update profile fields, status, custom fields, and deterministic active or away presence. File writes support the current external upload flow with local upload URLs, file share messages, reads, lists, downloads, and deletes. Pin and bookmark writes support channel message pins and link bookmarks. View writes support App Home publishing and modal stacks. Seeded OAuth apps and OAuth installs create bot users and installation records. OAuth exchanges and explicit token seeds create scoped token records. State changes dispatch event_callback payloads to configured webhook URLs.
Auth
POST /api/auth.test- test authentication
Scope checks are relaxed by default for local development. Set slack.strict_scopes: true in seed config to make supported Web API methods return Slack-style missing_scope errors with needed and provided fields. Strict mode checks chat:write, channels:read, channels:history, channels:join, channels:manage, channels:write, groups:read, groups:history, groups:write, im:read, im:history, im:write, mpim:read, mpim:history, mpim:write, users:read, users:read.email, users.profile:read, users.profile:write, users:write, files:read, files:write, pins:read, pins:write, bookmarks:read, bookmarks:write, reactions:read, reactions:write, and team:read. Slack lists no method-specific scopes for views.publish, views.open, views.update, or views.push, so the emulator requires auth but does not add strict-scope checks for those methods.
Chat
POST /api/chat.postMessage- post message with text or rich payload fields (supports threads viathread_tsand DM user IDs)POST /api/chat.postEphemeral- post ephemeral message outside channel historyPOST /api/chat.update- update message text and rich payload fieldsPOST /api/chat.delete- delete messageGET /api/chat.getPermalink/POST /api/chat.getPermalink- get message permalinkPOST /api/chat.scheduleMessage- schedule pending messagePOST /api/chat.deleteScheduledMessage- delete pending scheduled messagePOST /api/chat.scheduledMessages.list- list pending scheduled messagesPOST /api/chat.meMessage- /me message
Conversations
POST /api/conversations.list- list conversations (cursor pagination,types,exclude_archived)POST /api/conversations.info- get channel infoPOST /api/conversations.create- create channelPOST /api/conversations.archive- archive channelPOST /api/conversations.unarchive- restore archived channelPOST /api/conversations.rename- rename channelPOST /api/conversations.setTopic- update channel topicPOST /api/conversations.setPurpose- update channel purposePOST /api/conversations.history- channel history with rich message fields (top-level messages)POST /api/conversations.replies- thread replies with rich message fieldsPOST /api/conversations.join- join channelPOST /api/conversations.leave- leave channelPOST /api/conversations.invite- invite user to a channelPOST /api/conversations.kick- remove user from a channelPOST /api/conversations.open- open or resume DM/MPIMPOST /api/conversations.close- close DM/MPIMPOST /api/conversations.mark- set read cursorPOST /api/conversations.members- list members
Users
POST /api/users.list- list users (cursor pagination)POST /api/users.info- get user infoPOST /api/users.lookupByEmail- lookup by emailGET /api/users.profile.get/POST /api/users.profile.get- get user profile fieldsPOST /api/users.profile.set- update profile fields, status, and custom fieldsGET /api/users.getPresence/POST /api/users.getPresence- get active or away presencePOST /api/users.setPresence- set the authed user to away or automatic presence
Reactions
POST /api/reactions.add- add reactionPOST /api/reactions.remove- remove reactionPOST /api/reactions.get- get reactions for a message
Files
POST /api/files.getUploadURLExternal- create a local external upload sessionPOST /upload/v1/:fileId- receive raw uploaded file bytesPOST /api/files.completeUploadExternal- complete uploads and optionally share file messagesGET /api/files.info/POST /api/files.info- get file metadataGET /api/files.list/POST /api/files.list- list completed filesGET /files-pri/:fileId/:filename- download file bytes with a bearer token that can access the filePOST /api/files.delete- delete a completed file
Pins And Bookmarks
POST /api/pins.add- pin a message to a channelGET /api/pins.list/POST /api/pins.list- list pinned message items for a channelPOST /api/pins.remove- remove a message pin from a channelPOST /api/bookmarks.add- add a link bookmark to a channelPOST /api/bookmarks.edit- update a link bookmarkPOST /api/bookmarks.list- list channel bookmarksPOST /api/bookmarks.remove- remove a bookmark from a channel
Views
POST /api/views.publish- publish or update an App Home view for a userPOST /api/views.open- open a modal viewPOST /api/views.update- update a view byview_idorexternal_idPOST /api/views.push- push a modal view onto the current modal stackPOST /api/views.generateTriggerId- local helper for tests that need a modal trigger id
Modal opens and pushes require values from /api/views.generateTriggerId. Pass the returned value as trigger_id or interactivity_pointer; generate push values with an existing view_id and use them within 3 seconds.
Team
POST /api/team.info- get workspace info
Bots
POST /api/bots.info- get bot info
Incoming Webhooks
POST /services/:teamId/:botId/:webhookId- post text or rich payload fields via incoming webhook (supportschanneloverride andthread_ts)
OAuth
GET /oauth/v2/authorize- authorization endpoint (shows user picker)POST /oauth/v2/authorize/callback- local user picker callback that creates the auth codePOST /api/oauth.v2.access- token exchange
Inspector
GET /- tabbed local inspector for conversations, messages, files, views, auth records, incoming webhooks, event subscriptions, and event deliveries
oauth.v2.access returns a bot token, bot_user_id, app_id, team details, and the authed_user object. When user_scope is requested, authed_user also includes a user token and granted user scopes.
Event Dispatching
When supported Slack writes mutate state, the emulator dispatches event_callback payloads to configured webhook URLs matching Slack's Events API format:
messageevents onchat.postMessagemessagewithsubtype: message_changedonchat.updatemessagewithsubtype: message_deletedonchat.delete- rich message fields are included on posted
messageevents when present reaction_added/reaction_removedevents onreactions.add/reactions.removepin_added/pin_removedevents onpins.add/pins.removemessagewithsubtype: bot_messageon incoming webhook postschannel_archive/channel_unarchivefor public lifecycle archive writesgroup_archive/group_unarchivefor private lifecycle archive writeschannel_rename/group_renameand matching name message subtypes onconversations.renamemessagewith publicchannel_topic/channel_purposeor privategroup_topic/group_purposesubtypes on topic and purpose writesmember_joined_channel/member_left_channelon invite, join, leave, and kick writesim_created,im_open,im_close,im_marked, and group open/close/marked events for DM and MPIM writesuser_changeon profile writespresence_changeon presence writesfile_created,file_shared, andfile_deletedon file writesmessagewithsubtype: file_shareon shared file uploads
Current Limits
Slack Connect, Enterprise Grid admin APIs, Audit Logs API, SCIM, Legal Holds, Socket Mode, slash command and interaction simulation, user groups, reminders, stars, calls, canvases, lists, functions, workflows, chat streaming, legacy files.upload, exact rate limiting, and paid-plan behavior are not implemented.