Slack無料プランのバックフィルが、エラーも出さずに空振りしていた

問い合わせ対応チャンネルのログを自動でMarkdown化し、保存する仕組みを作っていたとき、しろまえ殿は妙なことに気づいた。

古い日付のメッセージだけ、何度取得しても件数が0で返ってくる。

エラーは出ていない。

処理は「成功」した顔をしている。

なのに、中身が無い。

90日という壁は、UIだけの話ではなかった

調べていくと、Slackの無料プランには「90日より古いメッセージは取得できない」という制約があることが分かった。

これがUIだけの制限だと思っていたのが、そもそもの見立て違いだった。

API(conversations.historyという履歴取得の呼び出し)にも同じ壁が効いていた。

Pro以上へ課金しない限り、90日より前へは原則遡れない。

そして厄介なのが、境界を越えた要求への応答の仕方だった。

エラーを返してくれれば、まだ気づける。

しかし実際には、空の配列を黙って返すだけだった。

「データが無い」のか「取得に失敗した」のか、見た目では区別がつかない。

たとえば宅配便の再配達依頼で、対応エリア外だと伝えられずに、ただ荷物が届かないだけなら、利用者は自分の依頼が通ったと思い込んでしまう。

それと同じ構造だった。

「取得漏れ」を前提にした設計に変える

この挙動を知ってから、しろまえ殿はバックフィル(過去分をまとめて取り込む処理)の設計を変えた。

「空配列は失敗として扱う」という前提を先に置く。

日次の通常バッチとは別系統のスクリプトにして、既にファイルがある分はスキップする冪等な作りにした。

途中で止めても、再開すれば重複なく続きから取れる。

画像は「実体」ではなく「参照」だった

もう一つ、見落としやすい点があった。

Slack標準のエクスポート機能が書き出す画像は、実体ではなくURLの参照だけだった。

ワークスペースから元のメッセージが消えると、そのURLも失効する。

過去ログを後から開いても、画像は表示されない。

画像そのものを残したいなら、ボット専用の認証キー(Slackが発行する専用のアクセス鍵)を使ってAPI経由でファイル本体をダウンロードする設計にする必要があった。

さらに、標準のエクスポート機能はパブリックチャンネルのみが対象で、プライベートチャンネルは別枠の申請が要る。

対象範囲によって、実現できることそのものが変わってくる。

「成功に見える失敗」を疑う癖

この一件でしろまえ殿が得たのは、Slackの仕様そのものより、確認の順番だった。

0件という結果を見たとき、「対象期間に何も無かった」と決めつける前に、まず取得範囲の制約を疑う。

エラーが出ないからといって、成功したとは限らない。

見た目の「成功」を、そのまま信じない。

それが、地味だが効く教訓だった。

参考にした公式情報

  • Slack ヘルプセンター「Usage limits for free workspaces」(無料プランのメッセージ・ファイルの90日可視性制限。確認日: 2026-08-27)

https://slack.com/help/articles/115002422943

制度・仕様は変更されることがある。実際に確認する際は、Slackの最新の公式情報を確認してほしい。