Known differences

Slack

A Slack workspace that answers the Web API, Events API, Socket Mode and interactivity flows slack_sdk and Bolt use, plus an MCP server.

Vendor reference: https://api.slack.com/methods ↗. Machine-readable: compat/slack.json.

Surfaces

KindPathNotes
REST/api/<method>the Web API; an unknown method answers 404 unknown_method
Streamingapps.connections.openSocket Mode WebSocket with an xapp- app-level token
WebhooksEvents APIevent callbacks and interactivity payloads delivered to your app
OAuthoauth.v2.accessbot and user tokens, and Sign in with Slack (openid.connect.*)
MCP/mcpSlack MCP tools over the same workspace

API versions: Web API (unversioned methods)

Supported

Not supported

Known differences and test guidance

ScenarioDifference from SlackIn your tests
Search rankingSearch is substring matching over the workspace, not Slack's ranked index; score and highlighting are approximations.Assert that the expected message is in the results, not on its rank or score.
Rate limitsNothing throttles on its own; a 429 only happens when you inject one.Do not expect organic tier limits. Inject throttle or fail_next to test retry handling.
Human activityNobody clicks buttons, votes or replies unless you inject the event or interaction.Drive interactions yourself; do not wait for a user response.
File contentsText, Markdown and CSV bodies are generated from the document's title, folder and owner, not original bytes.Assert on file metadata and format, not on content.
Canvases, polls, assistant threads, streaming replies, link unfurlsCanvases are markdown sections; polls are ordinary messages with poll blocks; assistant status and streamed text are stored but not rendered; chat.unfurl stores what the app sends and nothing fetches links.Assert on what the API returns, not on client rendering or automatic unfurls.
Timestamps on writesA message you post is stamped from the host clock, which can fall after the seeded history unless the workspace runs on today's date.Do not assert that new messages sort before or among the seeded history.
RestartsWithout a state directory the workspace lives in memory and a restart drops writes.Treat each run as starting from the seeded workspace.
Request sizeA Web API body over 8 MiB is refused with HTTP 413; Slack documents per-argument limits instead.Do not test large-body behaviour against the replica.

Fault injection

KeyWhat the client sees
throttle429 with Retry-After and {"ok": false, "error": "ratelimited"}, which slack_sdk retries on
fail_nextThe next N calls fail as throttle does, then clear
quota_limit429 ratelimited, the same shape as throttle
error_rate500 {"ok": false, "error": "internal_error"} for the given fraction of calls
latency_msFixed added latency on every data-plane request

Applies to every system