Skip to main content
All paths on this page are relative to https://inkbox.ai/api/v1/slack. An archive belongs to one identity’s workspace connection. The same workspace connected to another identity has a separate archive. Identity-level search reads across those workspace connections without combining their permissions.

Capture and access

All eligible observed messages are captured automatically for every conversation the connection can access. It retains message content and available display context, including reactions, names, profiles, and file metadata. Supported file and display-image copies are retained when available; inspect their cache status rather than assuming every copy exists. Capture is independent of webhook event selection. Your bot’s own messages can be captured without becoming inbound wake events. Capture does not grant access to the whole workspace. Installation, conversation membership, granted permissions, and Slack’s available history still constrain what can be captured or imported. Slack Connect conversations follow the same connection-specific access rules. Archive reads require an active identity and connected workspace. The Console and organization admin keys read retained messages from Inkbox storage without waiting for Slack. Removing the bot from a channel does not by itself remove that stored history. Ownership, deletion, and retention rules still apply. Agent-scoped reads also check current conversation access. These checks can require a live Slack request for each distinct conversation on a page, return 429 with Retry-After, or fail with 502. A page can be short or empty after access checks; continue with next_cursor when present. A concurrent archive or connection change can return 409; retry after resolving the state. Pausing an identity stops its live operations and webhook wake delivery, but eligible incoming messages can still be captured. Settings reads/updates, coverage, and backfill also require an active identity and connected workspace. The delete-archive operation remains available while paused or disconnected.

Get retention settings

Returns 200:
retention_days: null means no age-based expiration is configured; deletion and access rules still apply. revision changes when settings change.

Update retention settings

Requires an organization admin API key or the Console. Claimed agent keys can read settings but cannot change them.
Returns 200 with the settings object. Omitted or null retention_days resets the retention period to no age limit. Capture cannot be disabled or restricted to selected conversations. Use webhook event selection to choose which events wake your agent without limiting retained history. Shortening retention_days makes older messages unavailable and schedules them for deletion. Increasing it later does not restore content already deleted. Use delete archive to remove all retained content.

List retained messages

Timestamp filters contain 1–12 digits, a decimal point, and 1–6 fractional digits. Keep them as strings. Results are newest first, ordered by message timestamp, not capture time. Use latest_per_conversation=true for a conversation list. Older messages in an already-listed conversation do not create additional pages. Keep the same filters when following next_cursor. Omit this option when reading full conversation or thread history.

Response (200)

Use the retained message’s conversation ID and timestamp with the message-link endpoint to request a live permalink; the archive does not store one. Do not construct a link from a timestamp. id identifies the retained record; message_ts identifies the Slack message. Message source is event, backfill, or action. user_id and thread_ts can be null. files contains available metadata. Request include=files for copy and preview availability, then use the authenticated file endpoints to retrieve bytes. When a chronological listing has next_cursor, its optional page_boundary contains message_ts (string) and id (UUID). Together they identify the inclusive lower edge of the scanned page, before access checks remove unavailable messages. The boundary need not match a returned message; even an empty page can have one. Use it to reconcile the scanned range when refreshing a list, not to infer access to a message. Continue pagination with the opaque next_cursor, keeping the same filters. Exhausted pages and ranked search responses have a null boundary. Older responses may omit it. Observed edits update retained text. Observed deletions remove retained content; deleted messages are excluded from reads and search. A later history import does not restore a message that Inkbox has observed being deleted.

Include cached display context

Use include=conversation,sender,reactions,files to return display context with an authorized archive page. Omit include to keep the existing unexpanded response. These expansions read cached observations; they do not make a separate live lookup for each message or person. The same archive access rules apply. The search endpoints do not accept include or roots_only.
cURL
The optional included object deduplicates context for the returned messages: A DM may have a display title without a channel name. A missing or null name is not an empty channel name. A missing map entry means that context is not available in this page. It does not mean the resource was deleted. members_complete: false or null means the cached member list is not a complete roster. Display metadata never grants message or file access. Cached context can lag behind changes. Inspect status, fetched_at, and completeness fields. Keep caches separate by connection ID, and discard connection-specific display caches when the connection generation changes. Do not reuse one installation’s names, files, or emoji for another installation of the same workspace.

Reactions and thread summaries

With include=reactions, each message can include reactions and reactions_complete. Each reaction has name, nullable count, users, users_complete, and nullable reacted for the connected bot.
  • count: null means the total is unknown; it is not zero. count: 0 is a known zero.
  • users can be partial even when the count is known. Only users_complete: true makes that array complete.
  • reacted: null means the bot’s reaction state is unknown; false means no reaction was observed for the bot in the available complete information.
  • Missing or null reactions is not an empty complete snapshot. Treat an empty array as known empty only when reactions_complete is true.
Use the existing add/remove reaction operations to change reactions. The cached read response does not change mutation permissions or idempotency requirements. Custom reaction names resolve through included.emoji; aliases refer to another name rather than containing image bytes. Messages can also expose bot_id, subtype, edited_ts, nullable reply_count, and, with expansions, blocks, attachments, and latest_reply. Rich content preserves its native field names. reply_count: null means no count is known, not that the message has no thread. A known count summarizes observed thread activity; it does not prove every reply is retained or accessible. For a main timeline, use roots_only=true so replies with an available retained root do not consume the page limit. Replies whose root was never captured, expired, or was deleted remain visible; the missing root’s content is not restored. A root outside the current page is still retained, so its ordinary replies stay in the thread view. Open a thread with conversation_id and the reply’s thread_ts, omitting roots_only. Keep these filters unchanged while following that view’s next_cursor; do not reuse a main-timeline cursor for a thread or search.

Search across workspaces

Search retained messages across the workspace connections owned by one identity. Omit connection_id to search all its connected workspaces, or supply it to narrow the query to one workspace. This does not search another identity’s archive. Use the connection list to inspect each workspace’s current status. Disconnected workspaces and those requiring reauthorization are excluded. Explicitly selecting a connection that requires reauthorization returns 409. A claimed agent-scoped API key can omit identity_id; the API uses its owning identity. An organization admin API key or the Console must specify identity_id. An explicit identity must belong to the caller’s organization and, for an agent key, match that key’s identity.
cURL
Returns the same 200 response shape as retained message listing: messages, next_cursor, optional page_boundary (null for ranked search), and source: "archive". Each message includes connection_id; use it to identify the workspace and to request message links, threads, or other follow-up operations. Do not infer the connection from conversation_id alone. Search accepts plain keywords, not Slack search operators. Results are ranked by text relevance, then by message timestamp for ties. Pagination spans the entire identity search, not a separate page per workspace. Keep the identity, query, and filters unchanged when following next_cursor. The same credential-specific access rules apply as for retained message listing. Agent-scoped searches check current conversation access for each connection. A page can be short or empty after access checks; continue when next_cursor is present. If Slack cannot complete an agent access check, the API does not silently return results from only the remaining workspaces: the query returns an error, such as 429 or 502, for you to handle before retrying. The Console and organization admin keys read authorized stored results without live Slack checks. Search covers retained message text, not every live workspace message or attachment contents. Semantic search is not supported. Missing results can mean uncaptured history, incomplete import, expiration, deletion, or lost access. Inspect retention settings and import coverage separately for each workspace.

Search retained messages

This connection-scoped endpoint remains available for existing callers. Search matches retained message text using keyword/full-text search. It is not semantic search and does not search the entire live workspace or file contents.
cURL
Returns the same 200 response shape as retained message listing. Results are ranked by text relevance, then by message timestamp for ties. Use plain keywords, not Slack search operators. Keep the same query and filters when continuing with a cursor. Missing results can mean uncaptured history, incomplete import, expiration, deletion, or lost access—not that a conversation never happened.

Import accessible history

conversation_id is required. Omit or null thread_ts to import conversation history; supply a root timestamp to import that thread. The identity must be active and the workspace must be connected. A claimed agent key can request a backfill for its own connection. Before queuing an import, the API checks live conversation access; inaccessible conversations can return 403 or 404. New imports can also return 429 when too much import work is pending. Honor Retry-After before retrying. Returns 202 with a coverage record, not completed history. With restart: false (the default), an observed, paused, or failed pass is queued; pending, running, and completed passes are left unchanged. restart: true restarts the selected pass in any state, clears its cursor and progress bounds/count, and resets known thread passes when restarting an entire conversation. It does not restore deleted messages or override access limits. Use it deliberately, not on every status poll. After an archive purge, new messages continue to be captured automatically, but backfill returns 409 while the prior content is still being removed. Honor Retry-After before retrying the import; it does not run silently against an unfinished purge. Imports cover only messages within the configured retention period. Conversation imports can discover and queue threads separately. A completed conversation pass does not mean every thread is complete. Slack may impose restrictive page sizes and long delays between history requests. Rate-limited work waits before continuing. Do not infer complete workspace history from a successful request or an elapsed period.

Inspect coverage

limit defaults to 100 and accepts 1–200. Supply the returned UUID cursor to continue.
oldest_ts and newest_ts describe captured and imported message bounds, not proof that every message between them is present. imported_count is import progress, not a count of unique retained messages. includes_all_threads is currently false. Inspect separate thread records. access_revoked reflects the last observed membership event, not an authoritative current-access check. Do not use it as an authorization decision.

Delete archive

Requires an organization admin API key or the Console. Returns 202:
Existing retained content becomes unavailable to reads immediately and is removed asynchronously. Pending imports stop, but new messages continue to be captured automatically. This does not delete messages in Slack. Request a new import explicitly if you want to recover accessible earlier history after deletion completes. Disconnecting or uninstalling a workspace connection stops new capture through that connection and schedules its retained content for deletion. Reconnecting resumes capture automatically but does not recover deleted history. Deleting the owning identity removes its archive. Other identities and workspace connections remain independent.