Slack (Slack app, OAuth v2)
Building is easy: create an app at api.slack.com/apps (an agent can write the manifest), add bot scopes, and any workspace can install it via an 'Add to Slack' link once Manage Distribution is on, with no Marketplace review. The catch is reading history: since 29 May 2025, commercially distributed apps not approved for the Slack Marketplace get conversations.history and conversations.replies at 1 request per minute and 15 messages per call. Marketplace approval needs 10+ active workspaces first and then up to 10 weeks of review.
Review: none to distribute an unlisted app; Slack Marketplace review to lift the history rate limit, and Slack's API Terms name the Marketplace as the channel for commercial distribution
Timing: same day for posting alerts to other workspaces (unlisted distribution); roughly 3-4 months if you need Marketplace approval for full history reads (reach 10 active workspaces, then up to 10 business days preliminary + up to 10 weeks functional review).
Cost: free (some AI/agent features need a paid Slack plan on the installing workspace)
Before you start
- for buildA Slack account and a development workspace (the app's home workspace)sourceds7
- for buildHTTPS OAuth redirect URL (https://app.iskaria.com/api/oauth/slack/callback). The localhost URL in the profile is http and will be rejected; use an HTTPS tunnel for local dev.✓ Iskaria has itsourceds1s6
- for launchPublic landing page explaining the Slack app and how to install it (Marketplace only)✓ Iskaria has itsourceds5
- for launchPrivacy policy stating data collected, use, retention, and how to access/delete it; must also disclose LLM model, retention and data residency for AI apps (Marketplace only)✓ Iskaria has itsourceds5
- for launchPublic support page with a contact method, no account required, replies within 2 business days (Marketplace only)✓ Iskaria has itsourceds5
- for launch10 or more active workspaces with the app installed before Marketplace submissionsourceds4
- for launchApp icon. MISSING: the profile has no exported square PNG (logo.square512Png is null).✓ Iskaria has itinferred
An app works immediately in its development workspace. Installed only there (not distributed), it counts as an internal customer-built app and keeps Tier 3 history limits (50+ requests/min, up to 1,000 objects). Free Developer Program sandboxes cover paid-only AI features.
Who does what
- Write the full app manifest (name, description, bot scopes, HTTPS redirect URLs, events/Socket Mode)
- Implement the OAuth v2 install flow, per-workspace token storage and token rotation
- Build alert posting with per-channel throttling and event-driven reading instead of history polling
- Draft the Marketplace scope justifications, landing page, privacy-policy LLM section and support page
- Log in at api.slack.com/apps and create the app (paste the manifest), or issue an app configuration token
- Install to the development workspace and copy client id/secret/signing secret into server env
- Activate public distribution
- Get 10 clinic workspaces actively using the app before a Marketplace submission, then submit and answer reviewers
- Decide whether Iskaria's use counts as commercial distribution under Slack's API Terms
Steps
Generate a YAML/JSON manifest: display_information (name, description), features.bot_user, oauth_config.redirect_urls (HTTPS) and oauth_config.scopes.bot (chat:write, chat:write.public, channels:read, channels:history), settings (event subscriptions or Socket Mode, token rotation). Keep user scopes empty unless the agent must act as a person.
display_information.name Iskaria display_information.description Iskaria is a multi-clinic operations console with an AI assistant. Clinic staff connect their business accounts so the assistant can answer patient messages, track leads and report on marketing performance.Tailor to useCases.slack: lead alerts and daily summaries. oauth_config.redirect_urls ["https://app.iskaria.com/api/oauth/{provider}/callback","http://localhost:3000/api/oauth/{provider}/callback"]HTTPS only. oauth_config.scopes.bot api.slack.com/apps > Create New App > From a manifest > pick the development workspace > paste the manifest > Next > Create. ('From scratch' also works: name + workspace, then add scopes under OAuth & Permissions.) Fully automatable later via apps.manifest.create with an app configuration token (12-hour lifetime, rotated with tooling.tokens.rotate).
https://api.slack.com/appsUse the bot token (xoxb-, from `scope`) for posting alerts and reading channels the bot is in: it survives the installing user leaving. Request user scopes (`user_scope`, xoxp- token under authed_user) only for actions a bot cannot do, such as search:read.
Send users to https://slack.com/oauth/v2/authorize?client_id=...&scope=...&redirect_uri=...&state=...; on the callback exchange the code with oauth.v2.access using client id + secret. Store the bot token per workspace (team.id), encrypted server-side. Optionally enable token rotation (expiring access token + refresh token).
Enable the Agents feature in the app settings sidebar, add the assistant:write scope (top-nav entry point, 'agent' label) and subscribe to the assistant/agent events. Some of these features need a paid plan on the installing workspace.
OAuth & Permissions > Install to Workspace, copy the bot token into server env, invite the bot to a channel (/invite @Iskaria) and call chat.postMessage. Posting is limited to about 1 message per second per channel.
Manage Distribution > Share Your App with Other Workspaces: complete the checklist (HTTPS redirect URLs, no hard-coded tokens) and click Activate Public Distribution. You get an 'Add to Slack' button and shareable install URL. Any workspace can install now, without Marketplace approval; the app is 'unlisted'.
As an unlisted distributed app, every new install gets conversations.history and conversations.replies at 1 request/minute, max 15 messages. Prefer Events API / Socket Mode (message.channels events) and store only what you need, instead of polling history. Posting alerts is unaffected.
Once installed on 10+ active workspaces (used in the last 28 days): prepare landing page, privacy policy (incl. LLM disclosures), support page, a per-scope justification, and a test install path for reviewers (Slack cannot access your workspaces). Submit from the app's Marketplace settings. Preliminary feedback within ~10 business days; functional review up to 10 weeks (6 for resubmissions).
Scopes an agent typically needs
| Scope | Used for | Review tier | Evidence |
|---|---|---|---|
| chat:write | Post lead alerts and daily summaries as the bot in channels it is in | basic | sourceds8 |
| chat:write.public | Post to a public channel without inviting the bot first | basic | sourceds8 |
| channels:read | List channels so staff can pick where alerts go | basic | inferred |
| channels:history | Read public-channel messages the agent needs as context *:history scopes trigger enhanced Marketplace review; outside the Marketplace the method is throttled to 1 req/min, 15 messages. | sensitive | sourceds9s5s2 |
| groups:history | Same, for private channels the bot is invited to Skip it if alerts only go to public channels. | sensitive | sourceds9s5 |
What can slow you down or block approval
Since 29 May 2025, commercially distributed apps not approved for the Marketplace (new apps and new installs of existing ones) get conversations.history and conversations.replies at 1 request per minute with limit capped at 15. Marketplace apps and internal customer-built apps keep 50+ requests/minute and 1,000 objects. Iskaria installs into many clinic workspaces, so it is in the throttled class.
Workaround: Use the Events API / Socket Mode to receive messages as they happen; pursue Marketplace approval if deep history reads are core.
Slack's updated API Terms (effective 29 May 2025 for new apps, 30 June 2025 for older ones) call the Marketplace the only appropriate channel for commercially distributing apps, including templated custom apps that connect to a product. Unlisted distribution still works technically, but per-clinic 'internal' apps built from your manifest to dodge the limit are explicitly in scope.
Workaround: Treat unlisted distribution as a pilot; plan for Marketplace review once 10 workspaces are active.
Requires 10+ active workspaces before submission; preliminary review up to ~10 business days, functional review up to 10 weeks for new apps. Admin scopes are unlikely to be approved, future-use scopes are rejected, and *:history / files:read / search:read.* get enhanced review.
No training LLMs on Slack data; disclaimer about inaccurate outputs on the landing page and long description; disclose model, retention and data residency; no consequential decisions without human review; don't store Slack data, store metadata and fetch in real time; MCP-server-only apps are unsuitable.
Redirect URLs must use HTTPS and cannot contain '#'; the profile's http://localhost callback will not work.
Workaround: Use an HTTPS tunnel or a preview deployment for local OAuth testing.
Do not build on legacy bot tokens or classic apps. Classic-app deprecation is paused, but new work should be a (granular-permission) Slack app.
What we checked
| Claim | How | Result |
|---|---|---|
| Non-Marketplace apps get conversations.history/replies at 1 request/min and 15 objects from 29 May 2025 Applies to commercially distributed (unlisted) apps: new apps and new installs. Internal customer-built apps keep 50+/min and 1,000 objects. | Fetched Slack's changelog entry and the 3 June 2025 clarification | confirmed |
| Existing installs of unlisted apps were throttled from 3 March 2026 Slack's changelog as fetched still says existing installations are not affected; the March 2026 date appears only in third-party sources. | Compared community posts (DEV, vendor docs) with Slack's own changelog page | unverified |
| conversations.history is Tier 3 The reference still says Tier 3 (50+/min) and does not mention the non-Marketplace Tier 1 limit, so the reference page alone misleads agents that read history. | Fetched the method reference | corrected |
| Classic apps are being shut down Legacy custom bots stopped 31 March 2025, but the classic-app shutdown (rescheduled several times through November 2026) is now paused. | Fetched the 2024 deprecation changelog | corrected |
| Marketplace review takes weeks Up to 10 business days preliminary, up to 10 weeks functional (6 for resubmissions); 10 active workspaces required first. | Fetched the Marketplace review guide | confirmed |
| Non-Marketplace commercially distributed apps: conversations.history/replies at 1 req/min, limit 15, since 29 May 2025 for new apps and new installs; Marketplace and internal apps keep 50+/min, 1,000 objects Existing installations of older non-Marketplace apps kept the old limits per the changelog. | Independent check: re-fetched the Slack changelog of 2025-05-29 on 2026-10-30; the method page still shows Tier 3 (50+/min) as the default | confirmed |
| Marketplace: 10+ active workspaces to submit; preliminary review up to 10 business days; functional review up to 10 weeks for new apps; *:history, files:read, search:read.* get enhanced review Active = used in the past 28 days; the 10-week clock starts when a reviewer is assigned. | Independent check: fetched docs.slack.dev Marketplace review guide and app guidelines on 2026-10-30 | confirmed |
| OAuth endpoint behaviour (discovery metadata, PKCE, dynamic registration, unknown-client handling) Slack's discovery covers only Sign in with Slack (OIDC), not the v2 bot-scope flow; no PKCE methods advertised and no dynamic registration. /oauth/v2/authorize with an unknown client_id returns HTTP 200 with an HTML page. | Endpoint probe: node scripts/probe.ts on 2026-10-30 | confirmed |
- Whether existing installs of unlisted apps also became throttled on 3 March 2026: community posts say so, but Slack's own changelog (as fetched 2026-10-30) still says existing installs are not affected.
- Marketplace review times are Slack's stated maximums; real waits are not documented.
- Slack does not define 'internal customer-built app' precisely, so whether a manifest-cloned per-clinic app keeps Tier 3 is unclear (and the Terms cover templated custom apps).
- Exact Manage Distribution checklist items and app-icon size requirements were not fetched this session.
- Which AI/agent features need a paid plan is not itemised in the doc fetched.
Sources
- s1
- s2Rate limit changes for non-Marketplace apps (changelog, 29 May 2025) · provider-policy · accessed 2026-10-30
“limited to 1 request per minute, unless they are approved for the Slack Marketplace”
- s3Clarifying rate limit changes for non-Marketplace apps (changelog, 3 June 2025) · provider-policy · accessed 2026-10-30
“Any internal customer-built apps will maintain their existing rate limits and will not be subject to the new posted limits.”
- s4Slack Marketplace review guide · provider-policy · accessed 2026-10-30
“Your app has been installed on 10 or more active workspaces.”
- s5Slack Marketplace app guidelines and requirements · provider-policy · accessed 2026-10-30
“DON'T include scopes in your submitted app intended for future functionality.”
- s6Distributing your app · official-docs · accessed 2026-10-30
“apps intended for commercial distribution should be submitted and approved for listing in the Slack Marketplace.”
- s7Configuring apps with app manifests · official-docs · accessed 2026-10-30
“Manifests are YAML or JSON-formatted configurations bundles for Slack apps.”
- s8chat.postMessage method · official-docs · accessed 2026-10-30
“It will generally allow an app to post 1 message per second to a specific channel.”
- s9
- s10Developing AI apps / agents · official-docs · accessed 2026-10-30
“Developing and using some AI features require a paid plan, despite being visible in the app settings on any plan.”
- s11Discontinuing support for legacy custom bots and classic apps (changelog) · provider-policy · accessed 2026-10-30
“Classic apps deprecation has been paused”
- s12Slack Just Throttled Your OpenClaw Agent (DEV Community) · community · accessed 2026-10-30
“That grace period ended March 3, 2026.”
- s13Endpoint probe, 2026-10-30 · our-test · accessed 2026-10-30
“openid-configuration: grant_types [authorization_code]; scopes [openid, profile, email]; no code_challenge_methods_supported; no registration_endpoint”