Stream Chatは、米GetStream社が提供するアプリ内チャットの基盤で、1対1やグループの会話、既読、リアクション、スレッドをSDKとAPIで組み込めます。チャットサーバーを自社で持たない代わりに、月間アクティブユーザー(MAU)と同時接続数に応じて費用が決まる料金体系です。この記事では、無料のBuildと有料プランの月額、公開されている超過単価、Node.jsでのトークン発行からJavaScriptでの接続・送信までのコード、React向けの画面部品、レート制限、そしてSendbirdや自前実装を選ぶべき条件を、公式ドキュメントの記述をもとに整理します。
まとめ:Stream Chatが向くアプリと、Sendbird・自前実装との分かれ目
Stream Chatが合うのは、マッチングやマーケットプレイス、コミュニティのように利用者同士の会話が製品の中心にあり、MAUが数千から1万人規模まで伸びる見込みのあるアプリです。有料の最小構成であるStartは年払いで月399ドル、10,000MAUと同時接続500までを含みます。上限を超えた分の単価も料金ページに載っているため、伸びたときの費用を契約前に計算できます。
反対に、店舗と顧客の問い合わせ窓口のように会話量が少ないチャットなら、固定費が見合いません。WebSocketやFirebaseで必要な範囲だけを作る自前実装のほうが安く済みます。同じ用途のSendbirdと比べると、Stream Chatは1ドルあたりのMAU枠が広く、超過単価が公開されている点で見積もりを立てやすい製品です。
Stream Chatの仕組み:クライアントSDK・サーバーSDKと6種のチャネル型
組み込みで触るのは、利用者の端末で動くクライアントSDKと、自社サーバーで動くサーバーSDKの2つです。どちらも同じnpmパッケージstream-chatで提供されています。
クライアントSDKとサーバーSDKの役割分担、APIキーとシークレットの扱い
クライアントSDKは、アプリやブラウザからStreamのサーバーへWebSocketで常時接続し、メッセージや既読の通知を受け取ります。JavaScript SDKの公式ドキュメントのとおり、初期化に使うのはAPIキーだけです。iOS(Swift)・Android(Kotlin)・Flutter・React Native・Unity向けにも同系統のSDKがあります。
サーバーSDKは、APIキーとAPIシークレットの両方で初期化します。ユーザーの登録、接続用トークンの署名、システムからの送信、チャネル型の権限設定はこちらの担当です。シークレットは全ユーザーを操作できる鍵なので、アプリのコードやブラウザに置いてはいけません。GitHubのリリース一覧では2026年10月16日時点の安定版が9.54.0で、並行して10.0.0のRC版が出ています。RC版にはclient.activeChannelsまわりの破壊的変更が含まれるため、本番は9系で組み、10系の正式版が出てから移行を検討するのが無難です。
messaging・livestreamなど6種のチャネル型と選び方の目安
会話を置く部屋をStream Chatではチャネルと呼び、権限や機能の初期設定をまとめたものがチャネル型です。チャネル型の公式ドキュメントには6種が載っています。
| チャネル型 | 想定する用途 |
|---|---|
| messaging | マッチング・マーケットプレイス・SNSのDM・会話 |
| commerce | 購入者と事業者の会話、サポート窓口 |
| livestream | ライブ配信・ライブコマースのコメント欄 |
| team | Slackのような社内チャット |
| gaming | ゲーム内チャット |
| agent | 利用者とAIエージェントの会話 |
チャネル型の選択に迷ったら、まずmessagingから始めてください。livestreamはメンバー登録なしで読み書きできる設定なので、DMに使うと誰でも書き込めてしまいます。型は後から権限を調整できますが、用途に近い型を選んでおくと設定の変更が少なくて済みます。
Stream Chatの料金:無料のBuildと公開された超過単価で見積もる
金額は2026年10月16日時点のStream Chatの公式料金ページに載っている値です。
Build・Start・Elevateの月額とMAU・同時接続数の上限
料金は送ったメッセージ数ではなく、MAUと同時接続数の枠で決まります。
| プラン | 月額(年払い/月払い) | MAU | 同時接続 | 主な追加機能 |
|---|---|---|---|---|
| Build | 0ドル | 1,000 | 100 | 全Chat機能・カード不要 |
| Start | 399ドル/499ドル | 10,000 | 500 | 高度なモデレーション・データエクスポート |
| Elevate | 599ドル/675ドル | 10,000 | 500 | マルチテナント・HIPAA・メッセージ翻訳 |
| Enterprise | 個別見積り | 個別 | 個別 | 99.999%SLA・専用サーバ・SAML/SSO |
MAUは「暦月の中で一度でもチャットへ接続したユーザー」と定義されています。アプリ起動時に全員を接続する作りなら、チャット画面を開かない人も数に入ります。同時接続はユーザー数ではなくWebSocket接続の数で、スマホとPCで同時にログインした1人は2接続です。夜の決まった時間に利用が集中するアプリでは、MAUより先に500接続の上限に当たることがあります。
超過単価が公開されている点と、Makerプログラムの無料枠の条件
Stream Chatの料金ページは、枠を超えた分の単価まで出しています。StartとElevateでは、MAUの超過が1人あたり0.09ドル、同時接続の超過が1接続あたり0.99ドルです。12,000MAUまで伸びた月なら、Startの年払い399ドルに2,000人×0.09ドル=180ドルが加わり、579ドル前後と見積もれます。保存メッセージやAPI呼び出し回数にも枠があり、超過は100万件あたり5ドル、100万回あたり7ドルです。
Sendbirdは超過単価を公開しておらず、比較するとSendbirdとは?チャットSDKの料金と実装手順、自前WebSocket実装との使い分けで扱った最小有料プランは年払い月349ドルで5,000MAUです。1ドルあたりのMAU枠は、Stream ChatのStartが約1.75倍です。
チームが5人未満で月の売上が1万ドル未満の事業者向けには、毎月100ドルの無料クレジットが付くMakerの枠もあります。受付数に限りがあると明記されているため、事業計画の前提にはせず、通れば得をする程度に扱ってください。
Node.jsでトークンを発行し、JavaScriptで接続して送信するまで
ここからコードです。Streamのダッシュボードでアプリを作り、APIキーとAPIシークレットを控えてから始めます。利用者のログインは自社の認証で済ませ、Stream Chatには自社サーバーが署名したトークンで接続させる構成にします。
Node.jsのcreateTokenで1時間で失効するトークンを返すAPI
トークンと認証の公式ドキュメントによると、トークンはAPIシークレットで署名するため、必ずサーバーで作ります。何も指定しなければ無期限で、一度漏れると使われ続けます。次の例は、ログイン済みの会員をStream側に登録し、1時間で失効するトークンを返すために、Expressで実装したAPIの処理例です。
npm install stream-chat
// server.js(Node.js + Express)
import { StreamChat } from 'stream-chat';
const serverClient = StreamChat.getInstance(
process.env.STREAM_API_KEY,
process.env.STREAM_API_SECRET,
);
// requireLogin は自社の認証ミドルウェア(ログイン済みの会員だけを通す)
app.post('/api/chat-token', requireLogin, async (req, res) => {
const userId = `member_${req.user.id}`;
await serverClient.upsertUsers([{ id: userId, name: req.user.displayName }]);
const now = Math.floor(Date.now() / 1000);
const token = serverClient.createToken(userId, now + 60 * 60, now);
res.json({ userId, token });
});
認証とトークンの共通ドキュメントでは、createTokenの第2引数が失効時刻、第3引数が発行時刻で、どちらもUnixエポックからの秒数です。ミリ秒を渡すと桁が合わず、事実上の無期限トークンになるので注意してください。発行時刻(iat)を入れておくと、後述の失効処理が効くようになります。
connectUserにトークンプロバイダーを渡し、1対1チャネルで送信
クライアント側では、connectUserにトークンの文字列ではなく、トークンを取りに行く関数を渡します。公式ドキュメントにあるとおり、有効期限が働くのはこの関数(トークンプロバイダー)で接続したときだけです。期限が切れると、SDKがこの関数を呼び直して接続を保ちます。
import { StreamChat } from 'stream-chat';
const client = StreamChat.getInstance('YOUR_API_KEY');
// 期限が切れるたびにSDKが呼び直すトークンプロバイダー
const tokenProvider = async () => {
const res = await fetch('/api/chat-token', { method: 'POST', credentials: 'include' });
const { token } = await res.json();
return token;
};
await client.connectUser({ id: 'member_10234', name: '山田' }, tokenProvider);
// IDを省いてメンバーだけを渡すと、同じ2人なら同じチャネルになる
const channel = client.channel('messaging', { members: ['member_10234', 'shop_staff_01'] });
await channel.create();
await channel.watch(); // 以降の新着や既読のイベントを受け取る
await channel.sendMessage({ text: 'ご注文の件で確認させてください' });
チャネル作成の公式ドキュメントでは、IDを省いた場合はメンバー一覧のハッシュでIDが決まり、並び順は結果に影響しません。DMで同じ2人の会話が複数に割れないのはこの仕組みのおかげです。ただし、この方式のチャネルには後からメンバーを追加できません。担当者が途中で加わる問い合わせ窓口のような用途では、注文番号などから自分でIDを付けて作ります。IDは最大64文字です。
サーバーからのシステム通知とrevokeUserTokenによるトークン失効
「担当者が対応を開始しました」のような自動メッセージは、サーバー側SDKの公式ドキュメントのとおり、送信者のuser_idを付けてサーバーから送ります。送信者には案内用のユーザーを1つupsertUsersで作っておきます。
// 注文番号からIDを付けた問い合わせチャネル(後からスタッフを追加できる)
const channel = serverClient.channel('messaging', 'order-58213', {
created_by_id: 'system_bot',
members: ['member_10234', 'system_bot'],
});
await channel.create();
await channel.sendMessage({ text: '担当者が対応を開始しました', user_id: 'system_bot' });
// 退会や端末紛失のとき:この時刻より前に発行したトークンをすべて無効にする
await serverClient.revokeUserToken('member_10234', new Date());
revokeUserTokenは、指定した日時より前に発行されたトークンを無効にします。発行時刻を持たないトークンは失効の判定ができず無効として扱われるため、先のエンドポイントのようにcreateTokenの第3引数に発行時刻を渡すことが必須です。アプリ全体のトークンを一度に無効にするrevokeTokensもあり、シークレットの漏えいが疑われたときの初動に使えます。
React v14のUIコンポーネントで画面を組み、レート制限に備える
画面を自作する前に動くものを見せたい場合は、公式のReact部品を使います。運用に入ってから詰まりやすいレート制限もこの章で扱います。
stream-chat-react v14の部品で一覧と会話画面を組む手順
React SDKの公式Getting Startedの構成に、先のトークンプロバイダーを組み合わせた例です。npmレジストリではstream-chat-reactの14.13.2が2026年10月13日に公開されています。v14では入力欄の部品名がMessageComposerになっており、古い記事にあるMessageInputでは動きません。
npm install stream-chat stream-chat-react
// App.tsx
import {
Chat, Channel, ChannelList, Window, ChannelHeader,
MessageList, MessageComposer, Thread, useCreateChatClient,
} from 'stream-chat-react';
import 'stream-chat-react/dist/css/index.css';
const userId = 'member_10234';
const filters = { members: { $in: [userId] }, type: 'messaging' };
const sort = { last_message_at: -1 };
const options = { presence: true, state: true };
export default function App() {
const client = useCreateChatClient({
apiKey: 'YOUR_API_KEY',
tokenOrProvider: tokenProvider, // 前の章の関数
userData: { id: userId },
});
if (!client) return <div>Loading...</div>;
return (
<Chat client={client}>
<ChannelList filters={filters} sort={sort} options={options} />
<Channel>
<Window>
<ChannelHeader />
<MessageList />
<MessageComposer />
</Window>
<Thread />
</Channel>
</Chat>
);
}
ChannelListのfiltersで、自分がメンバーのmessaging型だけを並べています。見た目はStreamの標準デザインです。社内向けや検証用はこのまま、一般向けの本番画面はCSSの上書きか部品の差し替えで寄せる、という分け方が現実的です。React Native版はstream-chat-react-nativeの9.10.0が出ており、Expoで試す場合の開発ビルドはExpo(React Native)とは?Expo Go・開発ビルド・EASの役割と採用判断で扱っています。
ユーザーごと毎分60件・送信は毎分1,000件のレート制限と429対策
レート制限の公式ドキュメントでは、制限が2段あります。1つはユーザー単位で、どのエンドポイントにもユーザー1人あたり毎分60リクエストの制限が掛かります。もう1つはアプリ単位で、セルフサーブのプランの既定値はプラットフォームごとにメッセージ送信が毎分1,000、ユーザー更新が毎分300、チャネル一覧の取得が毎分10,000です。超えると429が返ります。
見落としやすいのは、サーバーから一斉に送る処理です。全会員の問い合わせチャネルへキャンペーンを流すと、送信の上限に当たるため、1万チャネルへの配信に必要な時間は10分以上です。ログインのたびにupsertUsersを呼ぶ先の例も、利用が集中する時間帯には毎分300の枠を圧迫しかねません。名前が変わったときだけ呼ぶ、429なら間を空けて再送する、の2点を最初から入れておきます。一斉配信が目的なら、チャットではなくプッシュ通知の仕組みで送るほうが筋がよく、配信サービスの比較はOneSignalとは?プッシュ通知の料金と実装手順、FCM直接送信との使い分けで扱っています。
Stream Chatを選ぶ条件と、Sendbird・自前実装を選ぶ分岐
分かれ目は、チャットが製品の中心か付属機能か、そしてMAUがどこまで伸びるかです。
チャットが製品の中心で、10,000MAU規模まで伸びるならStream Chat
次の条件に2つ以上当てはまるなら、Stream Chatを選ぶ理由があります。
- 利用者同士のDMやグループ会話が、マッチング・コミュニティ・マーケットプレイスなど製品の中心にある
- MAUが5,000人を超え、1万人規模まで伸びる計画がある
- 伸びたときの月額を、公開されている超過単価で事前に説明する必要がある
- ライブ配信のコメント欄やAIエージェントとの会話など、DM以外の型も同じ基盤で扱いたい
5,000〜10,000MAUの帯では、Sendbirdの最小有料プランでは枠が足りず、Stream ChatのStartなら収まります。既読同期・未読数・通報と削除の管理まで自前で作る数か月分の開発費と比べれば、年払い月399ドルは回収しやすい水準です。メッセージの翻訳が要件にある場合は、Stream ChatではElevate(年払い月599ドル)が必要になる点も見積もりに入れます。
Sendbirdからの乗り換えは4週間が目安、同期はEnterpriseのみ
既にSendbirdで動いているアプリを料金の理由だけで移すのは、慎重に考えるべきです。Sendbirdからの移行ガイドでは、SDKの検証、バックエンドの連携、データのインポート準備と画面調整、最終インポート、切り替えという工程で、全体は通常4週間程度とされています。インポート自体にも数日かかることがあります。
モバイルアプリは利用者の更新時期を揃えられないため、旧版と新版が同時に動く期間が出ます。その間の会話を両方に流すリアルタイム同期は、Enterpriseプランでしか使えません。セルフサーブのプランで移すなら、停止時間を設けて一度に切り替える計画になります。月額の差が年数千ドル程度なら、移行の工数と停止のリスクのほうが大きくつくことが多いはずです。
問い合わせ窓口程度なら見送る、Buildの1,000MAUで作り込む失敗
店舗やサポート担当と顧客がやり取りする問い合わせ窓口程度なら、Stream Chatは見送るべきです。会話は1対1、既読と画像送信があれば足り、同時に話す人数も少ないためです。この規模でStartを契約すると、使う機能はごく一部なのに年間で4,788ドル(年払い月399ドル×12)を払い続けます。
よくある失敗は、無料のBuildの1,000MAUで作り込み、公開直前に有料化の費用で計画が崩れることです。Buildの次の段はStartで、年払いでも月399ドルからです。自前で作るなら、接続管理はWebSocketとは?仕組み・ハンドシェイクからNode.js実装・運用の判断まで、ルーム管理と再接続はSocket.IOとは?WebSocketとの違いから実装・スケールまでが出発点になります。SaaSと自前のどちらで作るか、既存の会員基盤とどうつなぐかまで含めて決めたい場合は、スマホアプリ開発の範囲で相談できる開発会社を選んでください。開発費の目安はアプリ開発の費用相場は?規模・OS・開発手法別の内訳で比べられます。
よくある質問
Stream Chatの導入検討で多い質問に、公式ドキュメントで確認できる範囲で答えます。
Stream Chatは無料で使えますか?
Buildプランで、MAU1,000人・同時接続100まで無料で使えます。クレジットカードは不要で、チャットの機能はすべて試せます。サポートはコミュニティのみです。チーム5人未満かつ月の売上1万ドル未満なら、毎月100ドルの無料クレジットが付くMakerの枠もありますが、受付数に限りがあります。本番でMAUが1,000人を超えるなら、Start(年払い月399ドル、月払い499ドル)以上が必要です。
Stream ChatとSendbirdはどちらが安いですか?
MAUの規模で変わります。最小の有料プランは、Stream ChatのStartが年払い月399ドルで10,000MAU、SendbirdのStarterが年払い月349ドルで5,000MAUです(2026年10月中旬の各公式料金ページ)。5,000MAUまでならSendbirdが月50ドル安く、5,000〜10,000MAUの帯ではStream Chatのほうが追加費用なしで収まります。Stream Chatは超過単価も公開されているため、伸びた月の費用まで比べられます。
開発中に認証サーバーを作らずに試す方法はありますか?
あります。アプリを開発モードにしてダッシュボードで「Disable Authentication Checks」を有効にし、client.devToken('ユーザーID')で作ったトークンで接続します。トークンの署名が検証されないため、誰でも他人のIDでなりすませる状態です。公式ドキュメントも本番には不適としています。公開前に必ず設定を戻し、サーバーでcreateTokenを使う構成に切り替えてください。
React NativeやFlutterのアプリでも使えますか?
モバイルアプリでも利用可能です。React Native向けにはstream-chat-react-native(2026年10月時点で9.10.0)があり、Flutter・iOS・AndroidもSDKの提供対象です。アプリを閉じている相手に新着を知らせるには、FCMやAPNsの認証情報をStreamのダッシュボードに登録し、端末のトークンをSDKから登録します。FCM自体の仕組みはFCM(Firebase Cloud Messaging)とは|プッシュ通知の仕組み・送信方法とFID移行にまとめています。
配信者向けの「Stream Chat AI」と同じ製品ですか?
別の製品です。Stream Chat AIは、TwitchなどのライブのコメントをAIで監視し、荒らし対策や自動応答を行うツールとして配信者向けに提供されています。この記事のStream Chatは、自社のアプリやWebサービスにチャット機能を組み込む開発者向けのAPIとSDKで、提供元はGetStream社です。名前で検索すると両方が混ざって出るため、料金や機能を調べるときは公式サイトのドメインがgetstream.ioかどうかで見分けてください。
関連記事
- Sendbirdとは?チャットSDKの料金と実装手順、自前WebSocket実装との使い分け:同じ用途のチャットSDKで、料金の段と認証の設計を比べられます
- WebSocketとは?仕組み・ハンドシェイクからNode.js実装・運用の判断まで実装者向けに解説:SaaSを使わずチャットを自前で作る場合の通信の土台です
- Socket.IOとは?WebSocketとの違いから実装・スケールまで:ルーム管理と再接続を自前で実装するときの選択肢です
- OneSignalとは?プッシュ通知の料金と実装手順、FCM直接送信との使い分け:チャットではなく一斉通知を送りたい場合の配信サービスです
- ボイスチャットの実装方法|WebRTC自作とVivox・Photon Voice等SDKの選び方【2026年10月】:チャットに音声通話を足す場合の実装方法と製品の比較です