Configuration
Resources
team is a cardinality-one snapshot of the workspace. users and
user_groups are top-level lists. conversations uses users.conversations
rather than conversations.list. That gives a membership-aware inventory,
because conversations.history rejects channels the bot can discover but has
not joined. It captures each channel id, and messages (one history walk per
conversation), bookmarks, and pins fan out from it.
thread_replies fans out from a capture-only threads walk of
conversations.history, not from messages. Slack reveals new replies on an
old thread only through the parent message’s latest_reply, and history has
no updated-since filter, so the walk reads every message in every enabled
conversation on every run. It emits nothing. thread_replies then calls
conversations.replies only for parents whose latest_reply is at or past the
saved replies watermark, so messages that never started a thread and threads
with no new activity cost no request. files is an independent top-level
list.
Modes
All resources support full reads. If interrupted, a top-level resource resumes after its last completed page. Children (messages, thread_replies, bookmarks, pins) always restart with their
parent.
Three resources are incremental.
All use the
numeric comparator (Slack timestamps are epoch numbers) and
declare no overlap window. The cursor field is fixed by the manifest. Only a
lookback window is user-configurable, which the numeric comparator supports.
All conversations share one saved messages cursor, and all threads share one
saved replies_since cursor. For example, Filament may finish scanning a busy
channel after a newer message was posted to a quiet channel that it already
scanned. Without a lookback, that quiet-channel message can fall before the
next run’s starting cursor. The same race applies to a reply posted in one
thread while a later thread is still being read. Configure a lookback of at
least one run’s duration on messages and thread_replies if late arrivals
matter.
An incremental thread_replies run still walks the full history of every
enabled conversation to find threads that moved. On a Tier 3 token that is
about one request per thousand messages at fifty or more requests a minute.
Edits and deletions of messages and replies are never observed, because Slack
keeps the original ts and history exposes no change filter.
Behavior
- Auth: bearer token from
tokenon every request. - Errors: Slack returns HTTP 200 with
{"ok": false, "error": …}on failure, so the manifest declares an error envelope. Any response carrying anerrorfield fails the run with that value as the message. - Pagination: cursor paging via
response_metadata.next_cursorfor users, conversations, messages, and thread replies.files.listis the exception. It uses page-number pagination (page/count, 100 per page, bounded bypaging.pages). - Rate limiting: no client-side limiter is configured. The engine backs
off on 429 responses using
Retry-After. Use a token from an app you created in your own workspace. Since May 2025 Slack limits apps distributed commercially outside the Slack Marketplace to oneconversations.historyorconversations.repliesrequest per minute with fifteen messages per page, which makes every message resource unusable at scale. Internal apps and Marketplace apps keep the standard Tier 3 limits. - Every resource carries a
rawremainder column preserving fields the manifest does not project.