{"manifest":{"id":"slack","name":"Slack","description":"Stateful Slack emulator for the Web API, OAuth v2 installs, incoming webhooks, and the request inspector.","docsUrl":"https://docs.emulators.dev/slack","surfaces":[{"id":"rest","kind":"rest","title":"Web API","status":"partial","basePath":"/api"},{"id":"oauth","kind":"oauth","title":"Slack OAuth","status":"partial","basePath":"/oauth"},{"id":"webhooks","kind":"webhooks","title":"Incoming webhooks","status":"partial"},{"id":"inspector","kind":"ui","title":"Inspector UI","status":"supported","basePath":"/_inspector"}],"auth":[{"id":"bearer","title":"Bearer token","type":"bearer-token","status":"partial"},{"id":"oauth-code","title":"OAuth authorization code","type":"oauth-authorization-code","status":"partial"}],"specs":[{"kind":"openapi","title":"Slack Web API subset","coverage":"hand-authored","url":"/openapi.json","notes":"The Web API is invoked over POST with form-encoded or JSON bodies and returns { ok: boolean, ... }.","operations":[{"operationId":"auth.test","method":"POST","path":"/api/auth.test","status":"hand-authored"},{"operationId":"chat.postMessage","method":"POST","path":"/api/chat.postMessage","status":"hand-authored"},{"operationId":"chat.postEphemeral","method":"POST","path":"/api/chat.postEphemeral","status":"hand-authored"},{"operationId":"chat.update","method":"POST","path":"/api/chat.update","status":"hand-authored"},{"operationId":"chat.delete","method":"POST","path":"/api/chat.delete","status":"hand-authored"},{"operationId":"chat.getPermalink","method":"POST","path":"/api/chat.getPermalink","status":"hand-authored"},{"operationId":"chat.scheduleMessage","method":"POST","path":"/api/chat.scheduleMessage","status":"hand-authored"},{"operationId":"conversations.list","method":"POST","path":"/api/conversations.list","status":"hand-authored"},{"operationId":"conversations.info","method":"POST","path":"/api/conversations.info","status":"hand-authored"},{"operationId":"conversations.create","method":"POST","path":"/api/conversations.create","status":"hand-authored"},{"operationId":"conversations.history","method":"POST","path":"/api/conversations.history","status":"hand-authored"},{"operationId":"conversations.replies","method":"POST","path":"/api/conversations.replies","status":"hand-authored"},{"operationId":"conversations.join","method":"POST","path":"/api/conversations.join","status":"hand-authored"},{"operationId":"conversations.invite","method":"POST","path":"/api/conversations.invite","status":"hand-authored"},{"operationId":"conversations.members","method":"POST","path":"/api/conversations.members","status":"hand-authored"},{"operationId":"users.list","method":"POST","path":"/api/users.list","status":"hand-authored"},{"operationId":"users.info","method":"POST","path":"/api/users.info","status":"hand-authored"},{"operationId":"users.lookupByEmail","method":"POST","path":"/api/users.lookupByEmail","status":"hand-authored"},{"operationId":"users.profile.get","method":"POST","path":"/api/users.profile.get","status":"hand-authored"},{"operationId":"users.profile.set","method":"POST","path":"/api/users.profile.set","status":"hand-authored"},{"operationId":"users.getPresence","method":"POST","path":"/api/users.getPresence","status":"hand-authored"},{"operationId":"users.setPresence","method":"POST","path":"/api/users.setPresence","status":"hand-authored"},{"operationId":"reactions.add","method":"POST","path":"/api/reactions.add","status":"hand-authored"},{"operationId":"reactions.remove","method":"POST","path":"/api/reactions.remove","status":"hand-authored"},{"operationId":"reactions.get","method":"POST","path":"/api/reactions.get","status":"hand-authored"},{"operationId":"pins.add","method":"POST","path":"/api/pins.add","status":"hand-authored"},{"operationId":"pins.list","method":"POST","path":"/api/pins.list","status":"hand-authored"},{"operationId":"pins.remove","method":"POST","path":"/api/pins.remove","status":"hand-authored"},{"operationId":"bookmarks.add","method":"POST","path":"/api/bookmarks.add","status":"hand-authored"},{"operationId":"bookmarks.list","method":"POST","path":"/api/bookmarks.list","status":"hand-authored"},{"operationId":"files.getUploadURLExternal","method":"POST","path":"/api/files.getUploadURLExternal","status":"hand-authored"},{"operationId":"files.completeUploadExternal","method":"POST","path":"/api/files.completeUploadExternal","status":"hand-authored"},{"operationId":"files.list","method":"POST","path":"/api/files.list","status":"hand-authored"},{"operationId":"views.publish","method":"POST","path":"/api/views.publish","status":"hand-authored"},{"operationId":"views.open","method":"POST","path":"/api/views.open","status":"hand-authored"},{"operationId":"team.info","method":"POST","path":"/api/team.info","status":"hand-authored"},{"operationId":"bots.info","method":"POST","path":"/api/bots.info","status":"hand-authored"},{"operationId":"oauth.v2.access","method":"POST","path":"/api/oauth.v2.access","status":"hand-authored"}]},{"kind":"oauth-metadata","title":"Slack OAuth v2 authorize and token exchange","coverage":"hand-authored"},{"kind":"manual","title":"Incoming webhook delivery","coverage":"partial"}],"seedSchema":{"description":"Seed the workspace, users, channels, bots, OAuth apps, tokens, and incoming webhooks.","fields":[{"key":"team","title":"Workspace","description":"Team name and domain.","example":{"name":"My Workspace","domain":"my-workspace"}},{"key":"users","title":"Users","description":"Members addressable by name.","example":[{"name":"developer","real_name":"Developer","email":"dev@example.com","presence":"active"}]},{"key":"channels","title":"Channels","example":[{"name":"general","topic":"General discussion"}]},{"key":"bots","title":"Bots","example":[{"name":"my-bot"}]},{"key":"oauth_apps","title":"OAuth apps","description":"Installable apps for the OAuth v2 flow.","example":[{"client_id":"12345.67890","client_secret":"example_client_secret","name":"My Slack App","redirect_uris":["http://localhost:3000/api/auth/callback/slack"],"scopes":["chat:write","channels:read"]}]},{"key":"tokens","title":"Tokens","description":"Pre-minted bot or user tokens.","example":[{"token":"xoxb-test-token","type":"bot","scopes":["chat:write","channels:read"]}]},{"key":"incoming_webhooks","title":"Incoming webhooks","example":[{"channel":"general","label":"Build alerts"}]},{"key":"strict_scopes","title":"Strict scopes","description":"Enforce token scopes on Web API calls."},{"key":"signing_secret","title":"Signing secret","description":"Secret used to verify request signatures."}],"example":{"team":{"name":"My Workspace","domain":"my-workspace"},"users":[{"name":"developer","real_name":"Developer","email":"dev@example.com","profile":{"title":"Local Developer","status_text":"Testing locally","status_emoji":":computer:"},"presence":"active"}],"channels":[{"name":"general","topic":"General discussion"},{"name":"random","topic":"Random stuff"}],"bots":[{"name":"my-bot"}],"oauth_apps":[{"client_id":"12345.67890","client_secret":"example_client_secret","app_id":"A000000001","name":"My Slack App","redirect_uris":["http://localhost:3000/api/auth/callback/slack"],"scopes":["chat:write","channels:read","channels:history"],"user_scopes":["users:read","users.profile:read"],"bot_name":"my-bot"}],"strict_scopes":false}},"stateModel":{"description":"Entities mutated by Slack provider calls.","collections":[{"name":"teams"},{"name":"users"},{"name":"channels"},{"name":"messages"},{"name":"ephemeralMessages"},{"name":"scheduledMessages"},{"name":"bots"},{"name":"oauthApps"},{"name":"installations"},{"name":"tokens"},{"name":"incomingWebhooks"},{"name":"files"},{"name":"fileUploadSessions"},{"name":"pins"},{"name":"bookmarks"},{"name":"views"},{"name":"viewTriggers"}]},"connections":[{"id":"web-api","title":"Slack Web API client (TypeScript)","kind":"sdk","language":"typescript","description":"Point @slack/web-api at the emulator instance.","template":"import { WebClient } from \"@slack/web-api\";\n\nconst slack = new WebClient(\"{{token}}\", {\n  slackApiUrl: \"{{baseUrl}}/api/\",\n});"},{"id":"slack-env","title":"Slack env","kind":"env","language":"bash","description":"Many Slack SDKs honor SLACK_API_URL and a bot token.","template":"SLACK_API_URL={{baseUrl}}/api/\nSLACK_BOT_TOKEN={{token}}"},{"id":"curl","title":"curl","kind":"curl","language":"bash","description":"Call a Web API method directly.","template":"curl -s -X POST {{baseUrl}}/api/auth.test \\\n  -H \"authorization: Bearer {{token}}\""},{"id":"base-url","title":"Base URL (env)","kind":"env","language":"bash","description":"Point your SDK or app at the emulator instead of the real provider.","template":"{{SERVICE_UPPER}}_BASE_URL={{baseUrl}}"},{"id":"create-credential","title":"Create a credential","kind":"curl","language":"bash","description":"Mint a working credential for this instance.","template":"curl -s -X POST {{controlBaseUrl}}/credentials \\\n  -H \"content-type: application/json\" \\\n  -d '{\"type\":\"{{defaultAuthType}}\"}'"},{"id":"inspect-ledger","title":"Inspect requests","kind":"curl","language":"bash","description":"Read the request ledger to validate how your app called the service.","template":"curl -s {{controlBaseUrl}}/ledger"}],"resetBehavior":{"description":"Resets the instance to its seeded baseline.","reseeds":true,"clearsLedger":true,"clearsWebhooks":true},"ledger":{"description":"Recent provider requests with sensitive headers and fields redacted.","recordsFields":["timestamp","method","host","path","route","operationId","correlationId","identity","request","response","summary","sideEffects","webhookDeliveries","durationMs"],"redactsSensitive":true,"correlationId":true,"webhookDeliveries":true,"sideEffects":true,"persistent":true,"maxEntries":1000},"inspectorTabs":[{"id":"overview","title":"Overview","kind":"landing","description":"Service surfaces, base URLs, and connection snippets."},{"id":"ledger","title":"Ledger","kind":"ledger","description":"Recent provider requests recorded by the emulator."},{"id":"state","title":"State","kind":"state","description":"Current seeded and mutated instance state."},{"id":"credentials","title":"Credentials","kind":"credentials","description":"Mint tokens, API keys, or OAuth clients."},{"id":"seed","title":"Seed","kind":"seed","description":"Seed state or load a scenario."},{"id":"spec","title":"Spec","kind":"spec","description":"OpenAPI / GraphQL spec sources and coverage."},{"id":"logs","title":"Webhooks","kind":"logs","description":"Webhook deliveries dispatched by the emulator."}]},"instance":null,"sampleInstance":{"service":"slack","instance":"your-instance","baseUrl":"https://slack.your-instance.emulators.dev","providerBaseUrl":"https://slack.your-instance.emulators.dev","controlBaseUrl":"https://slack.your-instance.emulators.dev/_emulate"},"connections":[{"id":"web-api","title":"Slack Web API client (TypeScript)","kind":"sdk","language":"typescript","description":"Point @slack/web-api at the emulator instance.","template":"import { WebClient } from \"@slack/web-api\";\n\nconst slack = new WebClient(\"{{token}}\", {\n  slackApiUrl: \"{{baseUrl}}/api/\",\n});","body":"import { WebClient } from \"@slack/web-api\";\n\nconst slack = new WebClient(\"<token>\", {\n  slackApiUrl: \"https://slack.your-instance.emulators.dev/api/\",\n});"},{"id":"slack-env","title":"Slack env","kind":"env","language":"bash","description":"Many Slack SDKs honor SLACK_API_URL and a bot token.","template":"SLACK_API_URL={{baseUrl}}/api/\nSLACK_BOT_TOKEN={{token}}","body":"SLACK_API_URL=https://slack.your-instance.emulators.dev/api/\nSLACK_BOT_TOKEN=<token>"},{"id":"curl","title":"curl","kind":"curl","language":"bash","description":"Call a Web API method directly.","template":"curl -s -X POST {{baseUrl}}/api/auth.test \\\n  -H \"authorization: Bearer {{token}}\"","body":"curl -s -X POST https://slack.your-instance.emulators.dev/api/auth.test \\\n  -H \"authorization: Bearer <token>\""},{"id":"base-url","title":"Base URL (env)","kind":"env","language":"bash","description":"Point your SDK or app at the emulator instead of the real provider.","template":"{{SERVICE_UPPER}}_BASE_URL={{baseUrl}}","body":"SLACK_BASE_URL=https://slack.your-instance.emulators.dev"},{"id":"create-credential","title":"Create a credential","kind":"curl","language":"bash","description":"Mint a working credential for this instance.","template":"curl -s -X POST {{controlBaseUrl}}/credentials \\\n  -H \"content-type: application/json\" \\\n  -d '{\"type\":\"{{defaultAuthType}}\"}'","body":"curl -s -X POST https://slack.your-instance.emulators.dev/_emulate/credentials \\\n  -H \"content-type: application/json\" \\\n  -d '{\"type\":\"bearer-token\"}'"},{"id":"inspect-ledger","title":"Inspect requests","kind":"curl","language":"bash","description":"Read the request ledger to validate how your app called the service.","template":"curl -s {{controlBaseUrl}}/ledger","body":"curl -s https://slack.your-instance.emulators.dev/_emulate/ledger"}]}