# 変更履歴

文字おこしくんは、公開 API（WebSocket・HTTP・Webhook）と、このドキュメント・仕様ファイルの変更を、新しい順にこのページに載せます。互換性の無い変更をするときは、WebSocket では `protocolVersion` を、HTTP ではパスの `/v1` を上げます。フィールド・エラーコード・任意の引数は、互換性のある変更として、予告なく足すことがあります。

## 2026-10-25

### Webhook

- 文字おこしくんは Webhook を始めました。文字おこしくんは文字起こしの開始（`session.started`）と終了（`session.ended`）を、Discord サーバーの管理者が登録した URL へ知らせます。Discord サーバーの管理者は管理画面の「開発者向け設定」で送信先を追加し、送る出来事を選べます（[Webhook リファレンス](webhooks.md)）。
- 文字おこしくんは Webhook の本文に Standard Webhooks の形で署名します。署名を確かめる依存なしの例 [mojiokoshi-webhook.ts](examples/mojiokoshi-webhook.ts)（TypeScript）と [mojiokoshi_webhook.py](examples/mojiokoshi_webhook.py)（Python）を公開しました（[署名を確かめる](webhooks.md#verify)）。Webhook の本文の形は [openapi.yaml](openapi.yaml) の `webhooks` にあります。
- Discord サーバーの管理者が発言を保存しない設定にしていても、あなたが `session.started` を受け取ってすぐに Subscribe で購読すれば、あなたの所に記録を残せます（[「保存しない」設定で記録を残す](webhooks.md#store-transcripts-off)）。
- [レート制限と上限](limits.md)に、Webhook の送信先の数の上限（Discord サーバーごとに 5 個）を足しました。
- [エラーコード](errors/index.md)に、管理画面の Webhook の操作に文字おこしくんが返すコード（[`webhook_not_found`](errors/index.md#webhook_not_found)・[`webhook_delivery_not_found`](errors/index.md#webhook_delivery_not_found)・[`webhook_limit_exceeded`](errors/index.md#webhook_limit_exceeded)）を足しました。

## 2026-10-14

### 料金と上限

- 文字おこしくんは、クレジットをなくしました。文字おこしくんは、どの Discord サーバーでも、文字起こし・HTTP API・書き出しを無料で提供します。文字おこしくんは、Discord サーバーの記録の保存期間を延ばす月額の応援（使い方の[応援して機能を強化](../help/charge.md)）だけを有料にしました。
- 文字おこしくんは、Discord サーバーのレベルが上がったときに、まだ消していない記録の保持期限（`retainUntil`）も、セッションの終了から上がったレベルの日数まで延ばすようにしました。レベルが下がっても、文字おこしくんは保持期限を早めません（[レート制限と上限](limits.md)）。
- 文字おこしくんは、セッションの作成に `402 credits_exhausted` を返さなくなりました。[エラーコード](errors/index.md#credits_exhausted)には、使わなくなったコードとして `credits_exhausted` を残します。
- 文字おこしくんは、Discord サーバーごとの同時トラック数の上限（10）をなくしました。1 接続のトラックの上限（64 本）は変わりません（[レート制限と上限](limits.md)）。
- 文字おこしくんは、API キーで作ったセッションで開いているトラックを、全部の API キー（ほかの利用者のキーを含む）で合わせて数え、同時に 20 本までにしました。文字おこしくんは、20 本を超える `track_open` を、非 fatal な [`track_limit_exceeded`](errors/index.md#track_limit_exceeded) で断ります。文字おこしくんは、公式の Discord ボットのセッションのトラックを数えません（[レート制限と上限](limits.md)）。

### 書き出しと ChatGPT

- [文字起こしの書き出し](http.md#exportTranscript)に、`disposition`（`attachment` か `inline`。既定は `attachment`）を足しました。`transcript:download` のトークンのリンクに `disposition=inline` を付けると、ブラウザは記録をファイルとして保存せず、ページとして表示します。
- [書き出しのリンクを作る](http.md#createTranscriptDownloads)の応答に、`chatgptUrl` を足しました。`chatgptUrl`（[`GET /v1/sessions/{sessionId}/chatgpt`](http.md#openTranscriptInChatGpt)）を開くと、文字おこしくんは、記録を議事録として要約するよう頼む文と、記録のページのアドレス（`format=text&disposition=inline`）を入れた ChatGPT（`https://chatgpt.com/`）へ転送します。`chatgptUrl` には、`urls` と同じ `transcript:download` のトークンが入っています。

### 表示ページ

- 表示ページの `view` から `stage` と `timeline` をなくしました。表示ページは、`view=stage` を対面（`seats`）で、`view=timeline` をレーン（`lanes`）で開きます。`stage` だけが使う `cols` と、`timeline` だけが使う `window` もなくしました（[表示ページの URL パラメータと CSS](viewer.md)）。
- 表示ページ（`overlay=1` の無いリンク）で選べる表示を、Discord のアクティビティと同じ 5 つ（`seats`・`captions`・`lanes`・`meeting`・`flow`）にしました。表示ページは、`overlay=1` の無いリンクの `view=telop` と `view=youtube` を、対面（`seats`）で開きます。
- 配信用オーバーレイ（`overlay=1`）に、YouTube のコメント欄風の表示（`view=youtube`）を足しました。配信用オーバーレイは、確定した発言を、YouTube のライブチャットと同じ要素名・ID の形で出します。あなたは YouTube のコメント欄向けに公開されている CSS を、OBS の「カスタム CSS」にそのまま貼れます（使い方の[表示ページと OBS](../help/obs.md#customize)）。
- 表示ページの Content-Security-Policy を広げ、OBS の「カスタム CSS」（インラインの `<style>`）と、カスタム CSS が `@import` で読み込む https の CSS と Web フォントを通すようにしました。

### Discord のコマンドと管理画面

- 文字おこしくんは、Discord の `/charge` をなくしました。今のコマンドは `/start`・`/stop`・`/link`・`/usage`・`/help`・`/settings` の 6 つです（使い方の[コマンドの一覧](../help/index.md#commands)）。登録をやめた `/transcribe-key` に古いクライアントから届いた要求にも、文字おこしくんは返答しなくなりました。
- 文字おこしくんは、文字起こしが終わったときのお知らせを、VC のチャットにだけ出すようにしました。お知らせには、「CSV でダウンロード」「JSON でダウンロード」に加えて、「ChatGPT で要約」のボタンが付きます。
- 管理画面の「API キー」の画面の名前を「開発者向け設定」に変えました。画面の URL（`https://moji.kaitoranma.com/app/guilds/<サーバー ID>/keys`）は変わりません。

## 2026-10-02

### Discord のコマンドの返答

- 文字おこしくんは、`/start` の返答に、表示ページと配信用オーバーレイを開くボタンを付けるのをやめました。表示ページと配信用オーバーレイのリンク（トークンの入った URL）は、`/link` の返答のボタンで受け取ってください（使い方の[表示ページと OBS](../help/obs.md#get-link)）。

### エラーコード

- 文字おこしくんは、Discord アクティビティ専用のエラー `not_in_channel` と `no_active_session` の `detail` の文と、[エラーコード](errors/index.md)の説明を書き直しました。文字おこしくんは、アクティビティを開いたチャンネルではなく、アクティビティを開いた人が今いるボイスチャンネルで、2 つのエラーを返すかを決めるようになりました。

## 2026-09-30

### 書き出しのリンクと CSV

- 書き出しのリンクを作る [POST `/v1/sessions/{sessionId}/downloads`](http.md#createTranscriptDownloads)（API キーの `transcripts:read`）を足しました。リンクには書き出しにだけ使える `transcript:download` のトークンが、クエリの `token` で入っています。資格情報を持たない人も、リンクを開くだけで記録をファイルとして保存できます。
- [文字起こしの書き出し](http.md#exportTranscript)の `format` に `csv`（見出し `日時,話者,発言`。先頭に UTF-8 の BOM）を足しました。

### Discord のコマンドの名前（英語の名前に変更）

- 文字おこしくんは、Discord のコマンドを、トップレベルの英語の名前に変えました: `/start`・`/stop`・`/link`・`/usage`・`/help`・`/charge`。どの言語の Discord でも同じ名前です。設定を見る `/settings` も足しました。今の名前の一覧は、使い方の[コマンドの一覧](../help/index.md#commands)にあります。
- このドキュメントでは、コマンドを今の名前で書きます（2026-09-29 の「日本語の名前だけで書く」はやめました）。
- 文字おこしくんは、HTTP API のエラー `no_active_session` と `credits_exhausted` の `detail` の文を、今のコマンドの名前（`/start`・`/charge`）で書くようにしました。

### 表示ページ

- 表示ページの右上の「⋯」から、「名前を出す」「アイコンを出す」「スクリーンリーダーで読み上げ」を外しました。あなたは名前・アイコンを出さない表示と読み上げを、URL パラメータの `hideNames`・`hideAvatars`・`live` で選びます（[表示ページの URL パラメータと CSS](viewer.md)）。表示ページは、`live` を URL に書き戻さなくなりました。

### Discord のコマンドの名前と、エラーの文

- 文字おこしくんは、Discord のコマンドの日本語の名前を、`/文字起こし` から `/字幕` に変えました（`/字幕 開始`・`/字幕 停止`・`/字幕 リンク`・`/字幕 利用状況`・`/字幕 ヘルプ`）。`/チャージ` と、英語の Discord での名前（使い方の[コマンドの一覧](../help/index.md#commands)）は変わりません。
- Discord は、コマンドの名前が変わると、そのコマンドの権限の設定を消します。Discord サーバーの管理者が、サーバーの設定の「連携サービス」で `/文字起こし` の権限を変えていたときは、`/字幕` の権限を設定し直してください。
- 文字おこしくんは、HTTP API のエラー `no_active_session` の `detail` の文を、今のコマンドの名前（`/字幕 開始`）で書くようにしました。ほかのエラーの `title` と `detail` の文と、[エラーコード](errors/index.md)の説明の文も、主語と目的語のある文に書き直しました。

## 2026-09-29

### ドキュメント

- コマンドは日本語の名前だけで書くようにしました（2026-09-28 の「英語の Discord での名前を添えます」はやめました）。英語の Discord での名前は、使い方の[コマンドの一覧](../help/index.md#commands)にあります。
- 管理 API と Discord アクティビティ専用の操作を、[HTTP API リファレンス](http.md)と公開の [openapi.yaml](openapi.yaml) から外しました。どちらも第三者の開発者は使えない操作です。
- 表示ページのページを[表示ページの URL パラメータと CSS](viewer.md)にして、URL パラメータとカスタム CSS の一覧にしました。リンクの受け取り方と OBS への貼り方は、使い方の[表示ページと OBS](../help/obs.md)にあります。

## 2026-09-28

### Discord のコマンド

- `/文字起こしキー`（英語の Discord では `/transcribe-key`）の登録をやめました。API キーの発行・一覧・取り消しは、管理画面の「API キー」（`https://moji.kaitoranma.com/app/guilds/<サーバー ID>/keys`）で行います。発行済みのキーはそのまま使えます。
- `/文字起こし ヘルプ`（英語の Discord では `/transcribe help`）を追加しました。始め方・字幕の見方・無料枠とチャージを、実行した人にだけ返します。
- `/文字起こし 開始`（英語の Discord では `/transcribe start`）を実行した人への返答に、表示ページと配信用オーバーレイを開くボタンを付けました（本文には URL を書きません）。`/文字起こし リンク`（英語の Discord では `/transcribe link`）の返答も、URL を本文に書かず、同じ 2 つのボタンで渡すようにしました（配信中に取り直しても、配信画面に URL が映りません）。リンクの返答は、Discord がボタンを受け付けないときだけ URL を本文に書きます（開始の返答は、ボタンなしで `/文字起こし リンク` を案内します）。
- このドキュメントでは、コマンドを日本語の Discord での名前で書き、英語の Discord での名前を添えます（例: `/文字起こし 開始`（英語の Discord では `/transcribe start`））。どちらも同じコマンドです。

### ドキュメントの場所

- 開発者向けドキュメントは `https://moji.kaitoranma.com/docs/`、規約・ポリシーは `https://moji.kaitoranma.com/legal/` に移りました。
- 公式の表示ページ・配信用オーバーレイの使い方（URL パラメータ・OBS の設定・デモ）を[表示ページと OBS](viewer.md)にまとめました。
- エラーの `type`（`https://moji.kaitoranma.com/docs/errors/#<code>`）と JSON Schema の `$id` も新しい URL になります。`type` で分岐せず、`code` で分岐してください。
- プログラムを書かない利用者向けの[使い方](../help/index.md)（`https://moji.kaitoranma.com/help/`）を作りました。ボットの追加・コマンド・字幕の見方・チャージ・困ったときは、そちらにあります。

### 表示ページの配色

- 公式の表示ページとアクティビティの地・面・線・文字の標準の色を、LP・管理画面と同じブランドの色にしました（[表示ページと OBS](viewer.md#見た目を変えるカスタム-css)）。カスタム CSS で `--mv-*` を上書きしている場合は、上書きした色がそのまま反映されます。

### クレジット

- 文字起こしはサーバーごとのクレジット（1 クレジット ＝ 話している人 1 人ぶんの発話 60 秒）を使います。残りが無いサーバーでは、新しいセッションの作成が `402 credits_exhausted` になります（[レート制限と上限](limits.md)）。

### API キーの発行は管理画面へ

- API キーの発行・一覧・取り消しは、Discord の `/文字起こしキー` から管理画面の「API キー」（`https://moji.kaitoranma.com/app/guilds/<サーバー ID>/keys`。Discord でログイン）に移りました。`/文字起こしキー` は、この画面へのボタンを返すだけにしたあと、登録をやめました（上の「Discord のコマンド」）。発行済みのキーはそのまま使えます。
- 発行のときにスコープ `transcripts:delete`（`DELETE /v1/sessions/{sessionId}`）と期限（`expiresAt`）を選べます。一覧に `lastUsedAt`・`expiresAt` が出ます。
- Discord の無音フレーム（Opus の `F8 FF FE`）は利用量に数えません。送らない場合も `sequence` は飛ばさないでください（[リファレンス](reference.md)）。

## 2026-09-26

### HTTP API の公開

- API キー（`mjk_live_…`）で使う HTTP API を公開しました。ベース URL は `https://moji.kaitoranma.com` です。Discord サーバーの管理者が `/transcribe-key create`（日本語では `/文字起こしキー 発行`）でキーを発行し、`/transcribe-key list` / `/transcribe-key revoke` で管理します。
  - セッションの一覧（`GET /v1/sessions`、カーソルでページ送り）・状態（`GET /v1/sessions/{sessionId}`）
  - `transcript:read` / `ingest:write` のセッショントークンの発行（`POST /v1/sessions/{sessionId}/tokens`。API キーでは既定 1 時間・最大 24 時間）
  - 書き出し（`GET /v1/sessions/{sessionId}/transcript`、JSON / テキスト）
  - 利用量（`GET /v1/usage`）
  - 自分で音声を送るためのセッションの作成・終了（`POST /v1/sessions`・`POST /v1/sessions/{sessionId}/end`、`ingest:write`）
- リファレンス: [HTTP API リファレンス](http.md) と [openapi.yaml](openapi.yaml)（OpenAPI 3.1）。openapi.yaml はサーバーのコードの定数とエラーコードから生成し、本物のサーバーの全操作の応答（ステータス・ヘッダー・本文）を契約テストで検証しています。
- エラーは RFC 9457 の problem details（`application/problem+json`）になりました。以前からの `error` / `message` も同じ値で残しています（互換性あり）。コードの一覧は[エラーコード](errors/index.md)と [errors.json](errors.json)（HTTP のコードもサーバーのコードから生成）。
- レート制限（API キーごと・送信元 IP ごとに 1 分あたり 120 要求）と `RateLimit-Policy` / `RateLimit` / `Retry-After` ヘッダー、`Idempotency-Key`（24 時間）を入れました（[レート制限と上限](limits.md)）。
- 依存なしの HTTP クライアントの例を公開しました: [mojiokoshi-http.ts](examples/mojiokoshi-http.ts)（本物のサーバーを相手にテスト済み）、[mojiokoshi_http.py](examples/mojiokoshi_http.py)。

### 開発者向けドキュメントの公開

- 開発者向けドキュメントを公開しました（このサイトの `/developers/`、[llms.txt](llms.txt)、[llms-full.txt](llms-full.txt)、[Agent Skill](skill/SKILL.md)）。
- WebSocket API（Ingest `protocolVersion` 1・Subscribe `protocolVersion` 1）の機械可読な仕様を公開しました: [asyncapi.yaml](asyncapi.yaml)（AsyncAPI 3.1）、[JSON Schema](schemas/common.json)（2020-12）、[errors.json](errors.json)。どれもサーバーのコードと同じ定義から生成し、本物のサーバーとの契約テストで確かめています。
- 依存なしの参照実装を公開しました: [mojiokoshi-subscribe.js](examples/mojiokoshi-subscribe.js)、[mojiokoshi_subscribe.py](examples/mojiokoshi_subscribe.py)。
- エラーコード `quota_exceeded` を追加しました（Ingest。テナントの 1 日の利用上限に達したとき、fatal）。エラーコードの追加は互換性のある変更なので `protocolVersion` は変わりません。知らないコードを受け入れるクライアントはそのまま動きます。
