AIR LOG 外部公開API

OpenAPI 3.1.0 · v1.0.0 · 機械可読仕様 (openapi.json)

外部システムから AIR LOG の機能 (会議・名刺・CRM・アクション・ナレッジ検索・Webhook) を呼び出すための公開API。認証は APIトークン (Authorization: Bearer airlog_...) のみ。 内部UIのセッションCookieは受け付けない。

認証

すべてのエンドポイントは APIトークン必須です。 設定画面で発行した airlog_ 始まりのトークンをAuthorization ヘッダで送信します (内部UIのセッションCookieは受け付けません)。 スキーム名の大文字小文字は問いません。

Authorization: Bearer airlog_xxxxxxxxxxxxxxxxxxxx

トークンには read / write のスコープがあります。 書き込み系 (録音開始・Webhook 登録/更新/削除) はwrite が必要です。 他人のリソースは存在ごと 404 を返します (IDOR防止)。

共通仕様

  • ベースURL: /api/v1
  • レート制限: 1トークンあたり既定 120 req/分 (write・AI系は個別に低め)。 超過は 429。
  • エラー形式: { "error": { "message": string, "code": string } }
  • ページング: limit (1–100・既定20) + offset。 一覧は { total, limit, offset, ... }。
  • 日時は ISO 8601 (UTC)。

クイックスタート

# 会議一覧を取得
curl -H "Authorization: Bearer airlog_xxxx" \
  "/api/v1/meetings?limit=10"

# 録音を開始 (write スコープ)
curl -X POST -H "Authorization: Bearer airlog_xxxx" \
  -H "Content-Type: application/json" \
  -d '{"meetingUrl":"https://zoom.us/j/123456789"}' \
  "/api/v1/meetings"

エンドポイント

account— アカウント (残高・プラン)

get/api/v1/account

アカウント情報 (残高・プラン)

認証中トークンの残高・プランを返す。 録音トリガ前の残高確認用。 **read**。

200401
get/api/v1/account/coin-transactions

コインの明細

新しい順。 正 = 付与、 負 = 消費。 `meetingId` が付く行はその会議の分。 残高は `GET /account`。 **read**。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • type(query)— 種別で絞り込む (RECORDING / SUMMARY / EXPORT / CHAT / PURCHASE 等。 知らない値は 400)
  • meetingId(query)— この会議の明細だけ
  • from(query)— この日時以降 (日付だけなら日本時間のその日の始まり)
  • to(query)— この日時以前 (日付だけなら日本時間のその日の終わり)
200400401404

meetings— 会議 (録音トリガ・一覧・詳細)

get/api/v1/meetings

会議一覧

トークン所有ユーザーの会議を新しい順に返す。 **read** スコープ。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • q(query)— 題名部分一致 (最大200文字)
  • from(query)— 開始日時の下限 (ISO 8601)
  • to(query)— 開始日時の上限 (ISO 8601)
  • status(query)— 状態で絞り込む (未知の値は 400)
200400401429
post/api/v1/meetings

録音開始 (ボット参加)

会議URLを指定して録音を開始する。 カレンダーに一致予定があれば実会議名・時刻・出席者で保存し、既に録音予定/録音中の会議は二重にせず既存を返す。 **write** スコープ。 コインは録音開始時に消費 (ここでは非消費)。

200201400402403502
get/api/v1/meetings/{meetingId}

会議詳細

文字起こし本文・要約・アクションアイテムを1回で返す。 他人の会議は 404。 **read**。 長い会議は `transcript=text` + `transcriptMaxChars` で本文を分けて読める (続きは `nextOffset` を `transcriptOffset` に渡す。 続きの回は `summary`・`actionItems`・`attendeeEmails` を返さない)。

パラメータ

  • meetingId(path, 必須)
  • transcript(query)— 文字起こしの返し方。 full=本文と発話の配列 (既定) / text=本文だけ (分割可) / none=文字数だけ (要約だけ読むとき)
  • transcriptOffset(query)— transcript=text のとき、 本文の何文字目から返すか (前回の nextOffset)
  • transcriptMaxChars(query)— transcript=text のとき、 1 回に返す最大文字数 (1–200000・省略時は全部)
200400401404
patch/api/v1/meetings/{meetingId}

会議タイトル変更

会議のタイトルを変更する。 要約パイプラインの停滞時計 (updatedAt) を進めない実装のため、 処理待ちの会議でも安全に改名できる。 他人の会議は 404。 **write**。

パラメータ

  • meetingId(path, 必須)
200400403404
delete/api/v1/meetings/{meetingId}

会議削除

会議と文字起こし・要約・録画(S3実体含む)を削除。 他人の会議は 404。 **write**。

パラメータ

  • meetingId(path, 必須)
200403404
get/api/v1/meetings/{meetingId}/recording-url

録画の再生 URL (署名付き・1 時間)

取込済みなら Supabase の署名 URL、 まだなら Recall から直接。 無いときは `url: null` と理由 (NOT_SAVED=設定で保存OFF / EXPIRED=取込期限切れ / NO_BOT=ボットが入っていない / UNAVAILABLE=一時的)。 **read**。

パラメータ

  • meetingId(path, 必須)
200404
patch/api/v1/meetings/{meetingId}/speakers

話者名の付け替え

ラベル (`話者1` 等) 単位でまとめて書き換える。 同じラベルを担当者に持つアクションアイテムも追随する。 ⚠️ `話者不明` は「誰が話したか読み取れなかった」行で、 名前を付けると複数人の発言がその人の名前になる。 **write**。

パラメータ

  • meetingId(path, 必須)
200400403404
post/api/v1/meetings/{meetingId}/resume

止まっている議事録生成を続きから再開

PROCESSING で、 かつ一定時間動いていない会議だけ (稼働中は 409 — 横取りすると課金とレート枠が溶ける)。 部分要約は消さないので追加のコインは要らない。 **write**。 1 会議 1 回/分。

パラメータ

  • meetingId(path, 必須)
200403404409429
post/api/v1/meetings/{meetingId}/regenerate

要約の再生成

完了 / 失敗した会議だけ。 既存の要約・アクションアイテムを消して最初から作り直す (SUMMARY のコインを消費)。 `instruction` は利用者の要約指示として保存され、 次回以降の自動生成にも効く (画面と同じ)。 完了は GET の status / Webhook で。 **write**。 1 会議 1 回/分。

パラメータ

  • meetingId(path, 必須)
200403404409429
post/api/v1/meetings/{meetingId}/resume-auto-join

止めた定例の自動参加を再開

毎回失敗する定例として止めた自動参加を、 次回以降について再開する。 また 3 回失敗すれば改めて止まる。 **write**。

パラメータ

  • meetingId(path, 必須)
200400403404
post/api/v1/meetings/{meetingId}/stop

録音停止

録音中/予約中の会議を停止する (ボットを退出/キャンセルし PROCESSING へ)。 未開始や停止不能な状態は副作用なしで現状を返す。 **write**。

パラメータ

  • meetingId(path, 必須)
200403404
post/api/v1/meetings/{meetingId}/export

議事録エクスポート

議事録を書き出す (md / html)。 **read** スコープだがコインを消費する (EXPORT)。 課金副作用があるため POST (GET にしない)。

パラメータ

  • meetingId(path, 必須)
  • format(query)— 出力形式
200400402404
post/api/v1/meetings/import-transcript

文字起こしの取り込み (テキスト)

録れなかった会議をあとから埋める。 他ツール (Zoom / Meet / Teams の書き出し・tl;dv・Notta・VTT/SRT) の文字起こしを、 既存の会議へ差し込む (`meetingId`) か会議ごと新しく作る (`title` + `startTime`)。 録音コインは取らない。 既に文字起こしがある会議は `replace: true` を明示したときだけ置き換える (409)。 `generateSummary` で議事録も作る (SUMMARY コイン。 始まらなかった理由は `summarySkipped`)。 **write**。 利用者単位 20/分。

201400403404409429
post/api/v1/meetings/import-audio/upload-url

音声/動画の署名付きアップロード URL (取り込み 1/2)

ファイルは返ってきた `uploadUrl` へ **PUT** で直接上げる (本文 = ファイル)。 API の本文で受ける口は無い (Vercel の 4.5MB 上限)。 上げ終わったら `key` を `POST /meetings/import-audio` に渡す。 **write**。 1 時間に 20 件。

201400403429
post/api/v1/meetings/import-audio

音声/動画からの取り込み (取り込み 2/2)

上げ終わった音源の文字起こしを始める。 完了は `GET /meetings/{meetingId}` の status か Webhook (`meeting.completed` / `meeting.failed`) で知る。 課金は文字起こしが成立してから 30 分ごと 1 コマ。 他人の鍵は同じ文言で断る。 **write**。 利用者単位 10/分。

201400403409429

meishi— 名刺

get/api/v1/meishi

名刺一覧

氏名/会社名/メールの部分一致で検索。 **read**。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • q(query)— 氏名/会社/メール部分一致 (最大200文字)
200401
post/api/v1/meishi

名刺登録 (手入力)

名刺を手入力フィールドで登録する (画像OCRは内部UI専用)。 会社を自動解決し、 個人メール一致は既存の人へ束ね、 同姓同社は警告する。 **write**。

201400403
get/api/v1/meishi/{cardId}

名刺詳細

全項目+紐づく確定議事録。 他人の名刺は 404。 **read**。

パラメータ

  • cardId(path, 必須)
200404
patch/api/v1/meishi/{cardId}

名刺更新

名刺のフィールドを更新する (誤字訂正・異動反映)。 `null` でクリア。 会社リンクは companyName/email を含めた時だけ再解決する (役職だけ変更しても会社リンクを失わない)。 **write**。

パラメータ

  • cardId(path, 必須)
200400403404
delete/api/v1/meishi/{cardId}

名刺削除

名刺と画像実体(他カード非共有分)を削除。 他人の名刺は 404。 **write**。

パラメータ

  • cardId(path, 必須)
200403404

contacts— CRM コンタクト

get/api/v1/contacts

CRM コンタクト一覧

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • stage(query)— 商談ステージで絞り込み
  • q(query)— 表示名部分一致 (最大200文字)
200401
post/api/v1/contacts

コンタクトの作成 (手入力)

`intakeSource: MANUAL` で作る。 `companyName` があれば既存の会社に結びつける。 **write**。

201400403
get/api/v1/contacts/{contactId}

CRM コンタクト詳細

パラメータ

  • contactId(path, 必須)
200404
patch/api/v1/contacts/{contactId}

CRM コンタクト更新

ステージ・次アクション・タグ等を更新。 ステージ変更は内部スレッド(SSOT)へ伝播。 次アクション設定は MANUAL 扱い。 **write**。

パラメータ

  • contactId(path, 必須)
200400403404
delete/api/v1/contacts/{contactId}

CRM コンタクト削除

コンタクトを削除する。 **会議に紐づく確定コンタクトは削除できない (400)** — 孤児化を防ぐため名前修正/統合へ誘導する。 未確認(自動起票)や会議紐づき無しの人は削除可。 削除でメンバー0になった会議スレッドも後始末する。 **write**。

パラメータ

  • contactId(path, 必須)
  • exclude(query)— 以後 intake が同じ相手を自動起票しないよう除外登録する (domain=会社単位 / email=個人単位)
200400403404

action-items— アクションアイテム横断

get/api/v1/action-items

アクションアイテム横断一覧

全会議のタスクを期限昇順で返す。 **read**。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • status(query)— ステータスで絞り込み (未知の値は 400)
  • meetingId(query)— 会議で絞り込み (自分の会議のみ。 他人の会議は 0 件)
200400401
patch/api/v1/action-items/{itemId}

アクションアイテム更新

完了マーク・期限・担当の変更。 自分の会議に属さないタスクは 404。 **write**。

パラメータ

  • itemId(path, 必須)
200400403404

knowledge— 議事録横断ナレッジ検索

post/api/v1/knowledge/query

議事録横断ナレッジ検索

質問を投げると過去の議事録を横断して出典付きで回答する。 **read** スコープだが AI クレジット (コイン) を消費する (BYO鍵設定時は0・該当会議なしは非課金)。 専用レート枠 20/分。 会話は保存され `conversationId` で続けられる。

200400402404
get/api/v1/knowledge/conversations

「AIに聞く」の会話一覧

最終発言の新しい順。 カーソル送り (`nextCursor` を `cursor` に渡す)。 `q` は見出しと発言の中身の部分一致。 **read**。

パラメータ

  • limit(query)
  • cursor(query)— 前ページ最後の会話 ID
  • q(query)— 見出し / 発言の部分一致 (最大100文字)
200401
get/api/v1/knowledge/conversations/{conversationId}

会話の全発言

古い順。 新しい方から最大 200 件 (`truncated` が true なら頭が切れている)。 他人の会話は 404。 **read**。

パラメータ

  • conversationId(path, 必須)
200404
delete/api/v1/knowledge/conversations/{conversationId}

会話の削除

発言ごと消す (議事録の中身を含みうるので、 消す手段は必ず残す)。 **write**。

パラメータ

  • conversationId(path, 必須)
200403404

slide-decks— 提案資料 (提案スライド / システム提案書) の成果物と設計書

get/api/v1/slide-decks

提案資料の版一覧 (横断)

提案スライド (SALES) とシステム提案書 (SYSTEM) の**版**を新しい順に返す。 作り直しても古い版は消えないので 1 会議に複数行が並ぶ (現行版は `isLatest`)。 **`?kind=` は受けない** — 種別の受け取り口は 1 か所 (未指定=SALES) という内部規約があり、 それを一覧に当てるとシステム提案書が黙って消えるため。 各行の `kind` で見分ける。 **read**。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • meetingId(query)— 会議で絞り込む (他人の会議は 404)
  • status(query)— 状態で絞り込む (未知の値は 400)
200400401404
get/api/v1/slide-decks/{deckId}

提案資料 1 版の詳細

一覧の項目に加えて、 紙面の目次 (`pages`) と、 **会議 × 種別で 1 つしかない保存先** (`designSheetForMeeting` / `driveFileForMeeting`) を返す。 設計書スプレッドシートと Google ドライブの PDF は版をまたいで使い回すため、 作り直した版では自身の `designSheet` / `driveFile` が null になる (相手に渡してある URL はこちらで取る)。 **read**。

パラメータ

  • deckId(path, 必須)
200401404
get/api/v1/slide-decks/{deckId}/docs

設計書 (要件定義 → 打ち手の検討 → 基本設計 → 詳細設計) の Markdown

Claude を呼ばないのでコインは消費しない。 `scope` は見積の枠の集計 (今回の対象 / 対象外・指摘)。 枠や印を動かす・設計書を直すのは画面 (関所)。 **read**。

パラメータ

  • deckId(path, 必須)
200404
get/api/v1/slide-decks/{deckId}/pdf

完成 PDF の署名付きダウンロードURL

16:9 PDF の署名URLを **JSON で** 返す (302 リダイレクトではない。 呼び出し側が有効期限を 知れるようにするため)。 URL は短命なので、 保存するのは `deckId` の方。 完成前・1 枚直しの最中は 409 (`DECK_PDF_NOT_READY`)。 コインは消費しない。 **read**。

パラメータ

  • deckId(path, 必須)
200401404409

system-images— 画面イメージ (システム全体像イメージ) の成果物

get/api/v1/meetings/{meetingId}/system-images

画面イメージ (システム全体像イメージ) の成果物

最新の版 (画面ごとの署名付き URL・5 分) と、 全ての版の目録。 生成・中止・版の削除は画面前提。 コインは消費しない。 **read**。

パラメータ

  • meetingId(path, 必須)
200404

talk-scripts— トークスクリプト (複数会議の逐語 → 営業トーク台本)

get/api/v1/talk-scripts

トークスクリプト一覧

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • status(query)
200400401
post/api/v1/talk-scripts

トークスクリプトの生成を始める

選んだ会議の文字起こしを**全部**読んで、 実際に使われた言い回しを根拠つきの台本にする。 ⚠️ コインを消費する (チャンク従量 + 節ごと。 先に `POST /talk-scripts/estimate` で見積もる)。 応答は受付まで (201)。 完成は `GET /talk-scripts/{talkScriptId}` で見る (数分〜)。 **write**。 5 分に 3 回。

201400402403429
post/api/v1/talk-scripts/estimate

作る前の見積り (無料)

総チャンク数・コインの目安・長さごとの所要時間 (分)・材料にできない会議 (`skipped`)。 Claude は呼ばない。 **read**。

200400
get/api/v1/talk-scripts/{talkScriptId}

トークスクリプトの詳細 (進捗・本文・逐語)

パラメータ

  • talkScriptId(path, 必須)
200404
delete/api/v1/talk-scripts/{talkScriptId}

トークスクリプトの削除

取り消せない。 **write**。

パラメータ

  • talkScriptId(path, 必須)
200403404
get/api/v1/talk-scripts/{talkScriptId}/export

台本の書き出し (md / html)

完成した台本を文書にする (JSON で返す。 議事録の export と同じ形)。 コインは消費しない。 完成前は 409。 **read**。

パラメータ

  • talkScriptId(path, 必須)
  • format(query)
200400404409
post/api/v1/talk-scripts/{talkScriptId}/retry

失敗した台本を続きからやり直す

払った材料・設計図・本文は消さない (最初から払い直さない)。 残りの抽出・本文のぶん**コインを消費する** (額は詳細の remainingEstimatedCoins)。 残高が次の段に足りなければ 402 (次の段と完走までの目安を文に含む)。 FAILED 以外は 409。 抽出が済んでいるのに材料ゼロなら 409。 **write**。

パラメータ

  • talkScriptId(path, 必須)
200402403404409429
post/api/v1/talk-scripts/{talkScriptId}/sections

章の AI 書き直し (コイン消費)

注文 (500 字まで) で 1 章を書き直させる。 出力上限に当たったときは保存も課金もしない (409)。 **write**。 20 回/分。

パラメータ

  • talkScriptId(path, 必須)
200400402403404409
patch/api/v1/talk-scripts/{talkScriptId}/sections

章の手直し (無料)

見出しと本文だけ (逐語 `evidence` は触れない — 誰も言っていない殺し文句を実績にしない)。 本文から消えた引用の数を `droppedQuotes` で返す。 **write**。

パラメータ

  • talkScriptId(path, 必須)
200400403404409

search— 題名・発話・要約の横断検索

get/api/v1/search

横断検索 (題名・発話・要約)

会議一覧の `q` は題名の索引にしか当たらない。 「どこで何と言ったか」はこちら。 1 種類あたりの走査は 500 件で頭打ちし、 打ったら `truncated: true` を返す (黙って落とさない)。 **read**。

パラメータ

  • q(query, 必須)— 検索語 (最大200文字)
  • type(query)
  • from(query)— 会議の開始日時の下限 (ISO 8601)
  • to(query)— 会議の開始日時の上限 (ISO 8601)
  • platform(query)
  • speaker(query)— 話者名の部分一致 (発話の一致だけに効く)
  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
200400401

notifications— アプリ内通知

get/api/v1/notifications

アプリ内通知の一覧

待機室の承認依頼・録音/要約の失敗・関所の確認待ちなど。 Webhook は会議の完了/失敗しか出さないので、 「人が動けば結果が変わる通知」はこちらで読む。 **read**。

パラメータ

  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • unreadOnly(query)
200401
post/api/v1/notifications/mark-read

通知を既読にする

`ids` を省略すると未読を全部。 他人の通知 ID は数えない。 **write**。

200400403

webhooks— アウトバウンドWebhook

get/api/v1/webhooks

購読中Webhook一覧

secret は返さない。 **read**。

200
post/api/v1/webhooks

Webhook登録

https の公開URLのみ (内部/プライベート宛は拒否)。 secret はこのレスポンスで一度だけ返す。 **write**。

201400403
patch/api/v1/webhooks/{webhookId}

Webhook更新 (一時停止/再開・購読差替)

enabled で有効/無効、 events で購読イベント差し替え。 URL/secret は変更不可。 **write**。

パラメータ

  • webhookId(path, 必須)
200400404
delete/api/v1/webhooks/{webhookId}

Webhook削除

未配信の delivery も CASCADE で削除。 **write**。

パラメータ

  • webhookId(path, 必須)
200404
get/api/v1/webhooks/{webhookId}/deliveries

Webhook 配信ログ

配信の成否・再試行状況を返す (デバッグ・監視用)。 自分の Webhook 以外は 404。 **read**。

パラメータ

  • webhookId(path, 必須)
  • limit(query)— 取得件数 (1–100・既定20)
  • offset(query)— 開始位置 (0以上・既定0)
  • status(query)— 配信ステータスで絞り込み
200400404

MCP (Model Context Protocol)

AIR LOG は MCP サーバーでもあります。 claude.ai / Claude Desktop / Claude Code / ChatGPT / Cursor などの AI クライアントから、 上の REST と同じ実装・同じレート枠・同じ権限 (read / write) で会議・議事録・CRM・名刺・提案資料に触れます。

# サーバー URL (Streamable HTTP・ステートレス)
POST https://airlog.ikemen.ltd/api/mcp

# 認証は 2 通り。 どちらも同じ APIトークン (airlog_…) になります
#  (1) OAuth 2.1 … claude.ai / ChatGPT のコネクタ・Claude Code (ヘッダ無しで登録して /mcp で認証)。 AIR LOG の同意画面が開きます
#      (この方法で出たトークンは MCP 専用。 REST (/api/v1) では 403 になります)
#      (動的クライアント登録 + PKCE S256。 メタデータ: /.well-known/oauth-authorization-server)
#  (2) Bearer   … Claude Code / Cursor 等。 設定画面で発行したトークンをヘッダに付けます
claude mcp add --transport http --scope user airlog https://airlog.ikemen.ltd/api/mcp --header "Authorization: Bearer airlog_xxxx"

# ChatGPT (アプリ / コネクタ): 設定 → アプリとコネクタ → 開発者モードを有効 → 「+ 作成」で上の URL を登録
#   認証は OAuth (クライアント ID / シークレットは空のまま。 ChatGPT が動的登録する)
#   → 「接続」で AIR LOG の同意画面 → 「許可する」 → 新しいチャットの「+」からアプリを選ぶ
#   利用者ごとに自分のアカウントで繋ぐ (管理者は不要。 誰のデータに繋がるかは同意画面でログインした本人で決まる)

OAuth で接続したアプリは、 設定画面の APIトークン一覧に MCP: アプリ名 として並びます。 「解除」を押せばその接続は切れます (アクセストークンは 24 時間で更新され、 90 日使われなければ失効)。 取り消せない操作 (会議・名刺・コンタクト・会話・台本の削除) と Webhook の管理、 音声ファイルの実体送信、 生成物の作成 (提案資料・画面イメージ) は MCP には出していません。

AI に渡すトークン・許可は読み取り専用をおすすめします。 文字起こしは会議の相手の発言そのものなので、 そこに紛れた指示で AI が録音開始や議事録の作り直しなどの操作をしてしまう余地を無くせます (読み取り専用の接続には 書き込みのツールが表示されません)。 読み取り専用でも、 議事録の書き出しとナレッジ検索はコインを消費します。 パスワード・トークンの発行・退会・支払いなど、 アカウントの操作はトークンや AI 連携からはできません。

ツール権限対応する REST説明
get_accountread
GET /account
ログイン中のアカウントの残高 (コイン)・プラン・チームを返す。 コインを消費するツール (説明に ⚠️ と「コインを消費」があるもの) の前に残高を確かめる用途。
list_meetingsread
GET /meetings
会議を新しい順に一覧する (題名・日時・状態・文字起こし/議事録の有無)。 本文は含まないので、 中身は get_meeting / get_transcript で取る。 出席者のメールは各会議 5 件まで (全体の人数は attendeeCount、 全員は get_meeting の part=attendeeEmails)。 q は題名の部分一致 (表記ゆれは吸収する。 話者名では当たらない)。
get_meetingread
GET /meetings/{meetingId}
1 つの会議の議事録 (要約・決定事項・未解決事項 unresolvedItems・次の接触 nextContact・キーワード・人物メモ peopleProfiles) とアクションアイテム (id 付き) を返す。 無料。 文字起こし本文は含まない (get_transcript でページ送りして読む)。 出席者のメール attendeeEmails は最大 50 件 (全体の人数は attendeeCount)。 議事録が大きくて 1 回に入らないときは、 一覧の部分を件数だけにした応答 (omittedParts) が返るので、 part と offset でその部分を読む (nextOffset が null になるまで)。
get_transcriptreadMCP 専用会議の文字起こしを発話単位で順番に返す (1 回最大 500 件。 本文が約 12,000 字に達したらその手前で区切る。 1 つの発話がそれより長いときは発話の途中で区切る)。 続きは、 返ってきた nextCursor をそのまま cursor に渡す。 nextCursor が null になったら全文を読み終えている。 特定の発話から読むときは offset (search_transcripts の segmentIndex) を渡す。 hasTimestamps が false のときは startSec は時刻ではなく並び順。
list_action_itemsread
GET /action-items
全会議のアクションアイテム (宿題) を期限の近い順に返す。 status や meetingId (1 つの会議に絞る) で絞れる。
update_action_itemwrite
PATCH /action-items/{itemId}
アクションアイテムの状態・担当・内容・期限を変える。 完了にするなら status を COMPLETED にする。 deadline は 2026-10-09 18:00 や 2026-10-09T18:00:00+09:00 の形 (オフセットが無ければ日本時間)、 null で期限を外す。
list_contactsread
GET /contacts
CRM のコンタクト (商談相手) を次アクションの近い順に返す。 stage や氏名 (q) で絞れる。
get_contactread
GET /contacts/{contactId}
コンタクト 1 件の詳細 (ステージ・ボール・タグ・メモ・次アクション)。
update_contactwrite
PATCH /contacts/{contactId}
コンタクトのステージ・ボール (SELF / COUNTERPART)・タグ・メモ・次アクションを変える。 次アクションを変えると「人が決めた」扱いになり、 自動更新で上書きされない。 タグを足す・外すときは addTags / removeTags、 メモに書き足すときは appendNotes を使う (今の値を読まずに足せて、 並行した変更も消さない。 ただし押し直すと二重に足されるので、 失敗や通信切れのあとは get_contact で確かめてから送り直す)。 どれかの引数が不正なら何も変えない。 ⚠️ tags と notes は全体の置き換え (並び替え・書き直すときだけ使う)。
list_business_cardsread
GET /meishi
名刺を新しい順に返す。 q は氏名・会社名・メールの部分一致。
get_business_cardread
GET /meishi/{cardId}
名刺 1 枚の全項目と、 その人が出席した (照合済みの) 会議 (新しい順。 1 回に最大 50 件・応答の上限に収まる件数まで)。 会議の続きは、 返ってきた nextOffset を offset に渡す (2 回目以降は会議だけが返る)。 nextOffset が null なら全部読み終えている。 会議の総数は meetingCount。
create_business_cardwrite
POST /meishi
名刺を手入力で登録する (画像は受けない)。 fields のキーは fullName / fullNameKana / companyName / department / title / email / phone / mobile / fax / postalCode / address / url (会社名は companyName。 それ以外の項目は断る)。 同じメールの人がいれば同一人物として束ねる (duplicate.kind='email')。 meetingIds のうち実際に紐づいた会議は linkedMeetingIds、 紐づけられなかった (存在しない・他人の) 会議は ignoredMeetingIds で返る。
update_business_cardwrite
PATCH /meishi/{cardId}
名刺の項目を変える。 fields に string で更新、 null で消す。 使える項目: fullName / fullNameKana / companyName / department / title / email / phone / mobile / fax / postalCode / address / url (会社名は companyName。 linkedCompany は台帳の名前なので書き戻さない)。 メモ (notes) はここでは変えられない (画面から)。 会社名やメールを変えても、 既にある別の会社にはっきり当たるとき以外は会社の紐づけ (linkedCompany) を変えない (応答の note で知らせる)。 紐づけを変えるときは companyLink で意図を明示する (moved = 転職など別の会社に / same_company = 同じ会社でメールのドメインが変わった / unlink = 外す)。
list_slide_decksread
GET /slide-decks
提案スライド / システム提案書の版を横断で返す (kind で見分ける)。 作り直しても古い版は残るので、 isLatest が「今の版」。 pdfAvailable が true なら get_slide_deck_pdf_url で PDF を取れる。
get_slide_deckread
GET /slide-decks/{deckId}
提案資料 1 版の詳細 (紙面の目次、 Google ドライブ / 設計書スプレッドシートの保存先、 相場の概算)。
get_slide_deck_pdf_urlread
GET /slide-decks/{deckId}/pdf
完成した提案資料 PDF の署名付きダウンロード URL (5 分で切れる)。 コインは消費しない。 完成前は DECK_PDF_NOT_READY で断る。
ask_knowledgeread(コイン消費・20/分)
POST /knowledge/query
過去の議事録と文字起こしを横断して質問に答える (出典つき)。 ⚠️ AI を呼ぶのでコインを消費する (該当会議が無ければ非課金。 自前の Anthropic キーを設定していれば 0)。 2000 文字まで。 会話は保存され (利用者の「AIに聞く」の履歴に出る)、 続きは返ってきた conversationId で聞く。 まず list_meetings / get_meeting / search_transcripts で足りる問いには使わない。
export_meeting_minutesread(コイン消費・30/分)
POST /meetings/{meetingId}/export
議事録を Markdown の文書として書き出す (HTML は画面から)。 ⚠️ EXPORT のコインを消費する (中身を読むだけなら get_meeting が無料)。 要約がまだ無い会議でも成功する (本文に未生成の旨が入る)。 1 回に入らない大きさならコインを引かずに断る。
start_recordingwrite
POST /meetings
会議 URL (Zoom / Google Meet / Microsoft Teams) を指定してボットを参加させ、 録音を始める。 ⚠️ 録音開始時にコインを消費する。 既に AIR LOG にある会議は二重に作らず既存の会議 ID を返す (duplicate=true)。 ★duplicate は参加済みの意味ではない: alreadyJoined=true のときだけ録音中/入室中、 false なら今からボットを入れ直した (参加に失敗した会議・予約だけの会議はこれで録り直せる)。
stop_recordingwrite
POST /meetings/{meetingId}/stop
録音中の会議のボットを退出させ、 文字起こし → 議事録の生成へ進める。 録音していない会議では stopped=false を返す。
rename_meetingwrite
PATCH /meetings/{meetingId}
会議の題名を変える (議事録や文字起こしには触らない)。 200 字まで。 制御文字と < > < > は使えない (<定例> は 【定例】 などに言い換える)。
search_transcriptsread
GET /search
語で会議を横断検索する。 list_meetings の q は題名にしか当たらないが、 こちらは発話 (誰がいつ何と言ったか) と要約にも当たる。 題名は全角/半角・空白の違いを吸収するが、 発話と要約は書いたとおりの文字列で当てる (「ABC商事」と「ABC商事」は別)。 0 件なら表記を変えて試す。 コインは消費しない。 発話の結果の segmentIndex を get_transcript の offset に渡すと、 その発話から先を読める (前も読むなら offset を少し小さく)。 truncated が true なら走査上限に当たっている (語を絞る)。
list_knowledge_conversationsread
GET /knowledge/conversations
ask_knowledge で作られた会話を最終発言の新しい順に返す (カーソル送り: nextCursor を cursor に渡す)。 q は見出しと発言の中身の部分一致。
get_knowledge_conversationread
GET /knowledge/conversations/{conversationId}
1 つの会話の発言を古い順に返す (出典つき)。 1 回に新しい方から最大 6 発言。 それより古い発言は、 返ってきた olderBefore を before に渡して読む。 続きを聞くなら ask_knowledge に conversationId を渡す。
list_notificationsread
GET /notifications
利用者宛ての通知 (待機室で承認が要る・録音/議事録の失敗・提案資料の確認待ちなど) を新しい順に返す。 「いま対応が要ることは?」に答えるときに使う。 unreadCount は未読の総数。
mark_notifications_readwrite
POST /notifications/mark-read
ids を省略すると未読を全部既読にする。 利用者が「読んだ」と言ったときだけ使う (勝手に既読にしない)。
list_coin_transactionsread
GET /account/coin-transactions
コインの付与・消費の明細を新しい順に返す (正 = 付与、 負 = 消費)。 「先月いくら使った?」は from / to で、 「この会議にいくらかかった?」は meetingId で絞り、 応答の summary.used を読む (同じ条件の集計。 付与・購入を含まない。 ページを送って amount を足さない)。 残高は get_account。
create_contactwrite
POST /contacts
コンタクトを手入力で作る (intakeSource=MANUAL)。 companyName があれば名刺の会社台帳の会社に結びつける (無ければ台帳に会社を作る)。 同じ人が既にいないか list_contacts で確かめてから使う。
get_recording_urlread
GET /meetings/{meetingId}/recording-url
録画の署名付き再生 URL (1 時間で切れる) を返す。 無いときは url=null と理由 (NOT_SAVED=設定で保存OFF / EXPIRED=期限切れ / NO_BOT=ボットが入っていない / UNAVAILABLE=一時的)。
get_system_imagesread
GET /meetings/{meetingId}/system-images
会議から起こした画面イメージ (ダッシュボード + 作業画面) の最新の版と全ての版の目録。 画像は署名付き URL (5 分)。 生成・中止・版の削除は画面から。 コインは消費しない。
get_slide_deck_docsread
GET /slide-decks/{deckId}/docs
提案資料 1 版の設計書 (要件定義 → 打ち手の検討 → 基本設計 → 詳細設計) を Markdown で返す (本文は 12,000 字ずつ返す。 nextOffset が null になるまで、 返ってきた nextOffset を offset に渡して読み進める。) 。 Claude を呼ばないのでコインは消費しない。 scope は見積の枠の集計 (今回の対象 / 対象外)。 枠や印を動かす・設計書を直すのは画面から。
rename_speakerswrite
PATCH /meetings/{meetingId}/speakers
文字起こしの話者ラベル (話者1 等。 get_transcript の各発話の speakerLabel) に名前を付ける / 外す (speakerName=null)。 speakerLabel には今の名前 (例 佐藤) も渡せる (同じ名前の話者が 2 人いればラベルで)。 この会議に無い話者が 1 つでもあれば何も変えずに断る。 同じラベルを担当者に持つアクションアイテムも追随する。 ⚠️ 「話者不明」は誰が話したか読み取れなかった行で、 名前を付けると複数人の発言がその人の名前になる (利用者に確かめる)。 最大 50 件・名前は 50 文字まで。
import_transcriptwrite
POST /meetings/import-transcript
録れなかった会議をあとから埋める。 他ツール (Zoom / Meet / Teams の書き出し・tl;dv・Notta・VTT/SRT) の文字起こしのテキストを、 既存の会議へ差し込む (meetingId) か会議ごと新しく作る (title + startTime)。 録音コインは取らない。 既に文字起こしがある会議は replace=true を明示したときだけ置き換える (⚠️ そのとき今の要約とアクションアイテム (完了にした・期限を入れたものも) も消える。 消した件数は応答の replacedSummaries / replacedActionItems)。 generateSummary で議事録も作るときはコインを消費し、 残高が足りなければ作らずに summarySkipped: 'INSUFFICIENT_COINS' と必要額を返す。 1000000 文字まで。 利用者単位 20 回/分。
resume_meeting_processingwrite
POST /meetings/{meetingId}/resume
PROCESSING のまま一定時間動いていない会議の議事録生成を続きから再開する (稼働中なら断る)。 追加のコインは要らない。 失敗 (FAILED) した会議は regenerate_summary を使う。
regenerate_summarywrite
POST /meetings/{meetingId}/regenerate
完了 / 失敗した会議の議事録を最初から作り直す。 ⚠️ SUMMARY のコインを消費し、 既存の要約とアクションアイテムは消える (利用者に確かめてから使う)。 instruction (500 字まで) は利用者の要約指示として保存され、 次回以降の自動生成にも効く。 完了は get_meeting の status で見る。
resume_auto_joinwrite
POST /meetings/{meetingId}/resume-auto-join
毎回失敗する定例として自動録音を止めた会議について、 次回以降の自動参加を再開する (過去分は録れない)。 また 3 回失敗すれば改めて止まる。
list_talk_scriptsread
GET /talk-scripts
トークスクリプト (複数会議の逐語から作った営業トーク台本) を新しい順に返す。 本文は get_talk_script。
get_talk_scriptread
GET /talk-scripts/{talkScriptId}
台本 1 本の進捗と章の目次 (sections[].index / heading / scriptChars)。 章の本文と逐語 (evidence = 文字起こしに実在することを機械照合したもの) は section に章の index を渡して 1 章ずつ読む。 本文は 12,000 字ずつ返す。 nextOffset が null になるまで、 返ってきた nextOffset を offset に渡して読み進める。 (逐語の多い章の 1 ページ目は、 応答の上限に収めるため本文が短くなる。 続きは nextOffset) 作成中なら progress を見る。 完成した台本を丸ごと欲しいときは export_talk_script。
estimate_talk_scriptread
POST /talk-scripts/estimate
選んだ会議でトークスクリプトを作るときのコインの目安・所要時間 (分)・材料にできない会議 (文字起こしが無い) を返す。 コインは消費しない。 トークスクリプトを作る前に必ず呼ぶ。 会議は 12 件まで。
create_talk_scriptwrite
POST /talk-scripts
選んだ会議の文字起こしを全部読んで営業トーク台本を作る。 ⚠️ コインを消費する (数十〜数百。 estimate_talk_script で見積もって利用者に確かめてから)。 応答は受付まで。 完成 (数分〜) は get_talk_script で見る。 purpose: first_meeting=初回商談トーク / hearing=ヒアリング設計 / objection=反論処理集 / closing=クロージング。 5 分に 3 回まで。 受け付けた後で応答が届かなかったときは、 押し直す前に list_talk_scripts で作られていないか確かめる (押し直すと二重に作られコインも二重にかかる)。
retry_talk_scriptwrite
POST /talk-scripts/{talkScriptId}/retry
FAILED の台本を続きから再開する (払った材料・本文は消さない = 最初から払い直さない)。 ⚠️ 残りの抽出・本文のぶんコインを消費する (額は先に get_talk_script の remainingEstimatedCoins で確かめる)。 残高が次の段に足りなければ 402 で必要額を返す。 失敗していない台本は断る。
export_talk_scriptread
GET /talk-scripts/{talkScriptId}/export
完成した台本を Markdown か HTML の文書として返す。 コインは消費しない。 完成前は断る。 本文は 12,000 字ずつ返す。 nextOffset が null になるまで、 返ってきた nextOffset を offset に渡して読み進める。
edit_talk_script_sectionwrite
PATCH /talk-scripts/{talkScriptId}/sections
台本の 1 章の見出し・本文を直接書き換える (コインは消費しない)。 本文の直し方は 2 通り。 (1) get_talk_script が本文を 1 回で返した章 (offset 0 で nextOffset が null) は全文の置き換え: script に直した全文、 scriptVersion に読んだときの scriptVersion。 (2) 分けて返った章はページの置き換えだけ: 直すページを読んだ応答の offset / pageChars / pageVersion をそのまま pageOffset / pageChars / pageVersion に渡し、 script に直したそのページ。 版が読んだときと違えば (先に別のページを直した・並行して直された) 断るので get_talk_script で読み直す (ページを直すと後ろのページの位置がずれるので、 続けて直すときは必ず読み直す)。 見出しだけなら heading だけでよい。 逐語 (evidence) は触れない。 本文中の引用マーカー [m0-3] を消すとその引用が落ちる (droppedQuotes で返る)。
revise_talk_script_sectionwrite
POST /talk-scripts/{talkScriptId}/sections
注文 (500 字まで) で台本の 1 章を AI に書き直させる。 ⚠️ コインを消費する (チャット料金)。 誤字の修正など小さな直しは edit_talk_script_section (無料) を使う。 出力上限に当たったときは保存も課金もしない。

Webhook (送出イベント / 署名検証)

購読した以下のイベントを、購読先へ署名付きで POST します。

イベント発生タイミングpayload
meeting.completed議事録の生成が完了した{ meetingId, title, completedAt }
meeting.failed会議が FAILED で終わった (自動再試行は行われない終端状態){ meetingId, title, failureReason, failedAt }

受信側は次で検証してください。

# 署名: X-AirLog-Signature: sha256=<hex>
#   HMAC_SHA256(secret, "{X-AirLog-Timestamp}.{生ボディ}")
# を計算して定数時間比較 + Timestamp の鮮度 (例 ±5分) を確認。
# 再送がありうる (at-least-once) ため X-AirLog-Delivery で冪等化。

© 株式会社イケメン (IKEMEN Co., Ltd.)