This page is available in Japanese only.
API リファレンス
概要
ベース URL は https://api.avacast.jp です。リクエストもレスポンスも JSON で、フィールド名は snake_case、日時は ISO 8601 (UTC) です。
認証
2 種類あります。どちらも Authorization: Bearer <値> ヘッダで渡します。
sk_live_… は API キー。サーバーだけが持ち、すべての API を呼べます。管理画面で発行します。
client_token はセッション作成時に返る短命のトークン。ブラウザに渡し、 そのセッションの発話と中断だけができます。
レート制限
X-RateLimit-Limit-Minute: 120
X-RateLimit-Remaining-Minute: 118
X-RateLimit-Limit-Hour: 3000
X-RateLimit-Remaining-Hour: 2941
Retry-After: 42 # 429 のときのみセッションの作成
POST/v1/sessionsAPI キー
アバターの枠を確保し、ブラウザへ渡すトークンを返します。
リクエスト
avatar_idstring必須使うアバターの ID。
voice.languagestring読み上げ言語。既定は ja。未対応の値は ja として扱います。
voice.voice_idstring声の ID。省略するとアバターの既定の声になります。書式は下の注記を参照。
voice.speednumber発話速度。0.8〜1.2。既定は 1.0。範囲外の値は丸めます。
idle_timeout_secondsnumber無発話で自動終了するまでの秒数。30〜1800。既定は 180。
metadataobject任意のラベル。利用状況の絞り込みに使います。
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| avatar_id | string | 必須 | 使うアバターの ID。 |
| voice.language | string | 読み上げ言語。既定は ja。未対応の値は ja として扱います。 | |
| voice.voice_id | string | 声の ID。省略するとアバターの既定の声になります。書式は下の注記を参照。 | |
| voice.speed | number | 発話速度。0.8〜1.2。既定は 1.0。範囲外の値は丸めます。 | |
| idle_timeout_seconds | number | 無発話で自動終了するまでの秒数。30〜1800。既定は 180。 | |
| metadata | object | 任意のラベル。利用状況の絞り込みに使います。 |
curl -X POST https://api.avacast.jp/v1/sessions \
-H "Authorization: Bearer $AVACAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "avatar_id": "avt_xxxxxxxx", "voice": { "language": "ja", "speed": 0.9 } }'レスポンス
{
"session_id": "ses_xxxxxxxx",
"client_token": "eyJhbGciOi...",
"webrtc": {
"signaling_url": "https://.../offer",
"events_url": "https://.../events",
"ice_servers": [{ "urls": "turn:...", "username": "...", "credential": "..." }]
},
"expires_at": "2026-09-05T12:30:00.000Z"
}- ブラウザへ渡す値は client_token と webrtc です。
- voice_id の書式: edge-tts の音声名 (ja-JP-NanamiNeural など)、または gemini:<声>:<性別>:<年代>:<調子> (例 gemini:Gacrux:female:50:calm)。調子は bright / clear / soft / warm / calm / gentle / deep / friendly。
- events_url は発話イベントの SSE です。?token=<client_token> を付けて開きます。JS SDK は自動で購読します。
- 1 セッションの最大長はプランで決まり、expires_at に入ります。Free 5 分、Starter 15 分、Standard 30 分、Business 60 分。延長はできません。
- 課金はセッションが開いていた時間です。無発話が続くと自動で閉じます。
- Idempotency-Key ヘッダに対応しています。
発話
POST/v1/sessions/:id/speakAPI キー
テキストをキューに積みます。前の発話の完了を待つ必要はありません。
リクエスト
textstring必須読み上げるテキスト。1,000 文字まで。
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| text | string | 必須 | 読み上げるテキスト。1,000 文字まで。 |
curl -X POST https://api.avacast.jp/v1/sessions/ses_xxxxxxxx/speak \
-H "Authorization: Bearer $AVACAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "text": "ご相談ありがとうございます。" }'レスポンス
{ "utterance_id": "utt_xxxxxxxx", "status": "queued", "queue_length": 1 }- ブラウザが接続する前に呼ぶと 409 session_not_connected になります。
- 発話中はアイドル判定が止まります。
- キューは 1 セッションあたり 20 件まで。超えると 429 queue_full になります。
- Idempotency-Key ヘッダに対応しています。
発話の中断
POST/v1/sessions/:id/interruptAPI キー
再生中の発話を止め、キューの未再生分を破棄します。
リクエスト
パラメータはありません。
curl -X POST https://api.avacast.jp/v1/sessions/ses_xxxxxxxx/interrupt \
-H "Authorization: Bearer $AVACAST_API_KEY"レスポンス
{ "interrupted_utterance_id": "utt_xxxxxxxx", "discarded_count": 2 }- 中断しても請求は変わりません。
セッションの状態
GET/v1/sessions/:idAPI キー
状態、接続時間、累計の発話時間を返します。
リクエスト
パラメータはありません。
curl https://api.avacast.jp/v1/sessions/ses_xxxxxxxx \
-H "Authorization: Bearer $AVACAST_API_KEY"レスポンス
{
"session_id": "ses_xxxxxxxx",
"status": "active",
"end_reason": null,
"queue_length": 0,
"connected_seconds": 312,
"total_speak_ms": 7500,
"expires_at": "2026-09-05T12:30:00.000Z"
}- connected_seconds が請求の根拠です。total_speak_ms は参考値です。
セッションの終了
DELETE/v1/sessions/:idAPI キー
セッションを終了します。終了済みに呼んでもエラーになりません。
リクエスト
パラメータはありません。
curl -X DELETE https://api.avacast.jp/v1/sessions/ses_xxxxxxxx \
-H "Authorization: Bearer $AVACAST_API_KEY"レスポンス
{ "session_id": "ses_xxxxxxxx", "status": "ended", "connected_seconds": 312, "total_speak_ms": 7500 }- 呼ばなくても、プランの最大長か無発話 (既定 180 秒) で自動的に閉じます。
- 自動で閉じた場合、接続時間は閉じるべきだった時刻までで数えます。
アバター一覧
GET/v1/avatarsAPI キー
使えるアバターを返します。プリセットと自社で作ったものが含まれます。
リクエスト
パラメータはありません。
curl https://api.avacast.jp/v1/avatars \
-H "Authorization: Bearer $AVACAST_API_KEY"レスポンス
{
"data": [
{ "id": "avt_xxxxxxxx", "name": "案内役A", "languages": ["ja", "en"], "is_preset": true }
]
}利用状況
GET/v1/usageAPI キー
当月の接続時間とセッション数を返します。期間を指定し、セッションの metadata の値ごとに分けて取ることもできます。
リクエスト
fromstringクエリ。期間の始まり (ISO 8601、時差つき)。省略すると当月の初め (UTC)。
tostringクエリ。期間の終わり (この時刻は含まない)。省略すると今。from から 366 日まで。
group_bystringクエリ。metadata.<キー> の形 (例 metadata.tenant)。キーは英数字・_・- の 64 文字まで。
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| from | string | クエリ。期間の始まり (ISO 8601、時差つき)。省略すると当月の初め (UTC)。 | |
| to | string | クエリ。期間の終わり (この時刻は含まない)。省略すると今。from から 366 日まで。 | |
| group_by | string | クエリ。metadata.<キー> の形 (例 metadata.tenant)。キーは英数字・_・- の 64 文字まで。 |
curl https://api.avacast.jp/v1/usage \
-H "Authorization: Bearer $AVACAST_API_KEY"
# 期間を指定して、metadata.tenant の値ごとに分ける
curl "https://api.avacast.jp/v1/usage?from=2026-10-07T03:12:00Z&to=2026-11-07T03:12:00Z&group_by=metadata.tenant" \
-H "Authorization: Bearer $AVACAST_API_KEY"レスポンス
{
"period": { "start": "...", "end": "..." },
"connected_seconds": 18640,
"total_speak_seconds": 4820,
"session_count": 312,
"utterance_count": 2914,
"limits": { "concurrency": 10, "monthly_connected_seconds": null }
}
// from / to / group_by を付けたとき
{
"period": { "start": "2026-10-07T03:12:00.000Z", "end": "2026-11-07T03:12:00.000Z" },
"connected_seconds": 5520,
"session_count": 41,
"group_by": "metadata.tenant",
"data": [
{ "key": "clinic-a", "connected_seconds": 3600, "session_count": 25 },
{ "key": "clinic-b", "connected_seconds": 1800, "session_count": 15 },
{ "key": null, "connected_seconds": 120, "session_count": 1 }
]
}- connected_seconds が請求の根拠です。開いているセッションの分を含みます。
- limits.monthly_connected_seconds に達すると、新しいセッションの作成が 402 payment_required になります。
- from / to / group_by のどれかを付けると、下の形で返します。期間をまたぐセッションは期間の内側の分だけを数えます (請求と同じ数え方)。session_count は期間中に始まったセッションの数です。
- data の key は metadata のその値 (文字列) で、キーが無いセッションは null にまとめます。接続時間の多い順に並びます。
- to が from より前、期間が 366 日を超える、書式が違うときは 400 invalid_request です。
ブラウザからの発話
POST/v1/client/sessions/:id/speakclient_token
client_token で認証します。会話ロジックがブラウザ側にある場合に使います。
リクエスト
textstring必須読み上げるテキスト。1,000 文字まで。
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| text | string | 必須 | 読み上げるテキスト。1,000 文字まで。 |
await fetch('https://api.avacast.jp/v1/client/sessions/ses_xxxxxxxx/speak', {
method: 'POST',
headers: {
Authorization: `Bearer ${clientToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ text: 'ご相談ありがとうございます。' }),
});レスポンス
{ "utterance_id": "utt_xxxxxxxx", "status": "queued", "queue_length": 1 }- client_token は 1 セッションにしか効きません。
- 中断は /v1/client/sessions/:id/interrupt です。
稼働確認
GET/v1/status不要
API が応答しているかを返します。外形監視 (UptimeRobot など) から叩くための口で、認証は要りません。
リクエスト
パラメータはありません。
curl https://api.avacast.jp/v1/statusレスポンス
{ "ok": true }- API (この口) が応答しているかだけを見ます。アバターの映像を作る GPU ノードの状態は含みません。
- 稼働状況は https://stats.uptimerobot.com/NboVaxn0Az でも公開しています。
ブラウザ SDK
WebRTC の接続と発話イベントの購読をまとめた小さな SDK です。avacast のドメインから読み込みます。互換を壊す変更はパスの版 (v1) を上げます。
<video id="avatar" autoplay playsinline></video>
<script type="module">
import { AvacastSession } from 'https://avacast.jp/sdk/v1.js';
// client_token と webrtc はサーバーで作ったセッションのレスポンスから受け取る (API キーは出さない)
const session = new AvacastSession(client_token, {
signalingUrl: webrtc.signaling_url,
iceServers: webrtc.ice_servers,
});
session.attach(document.getElementById('avatar'));
// 映像が届いてから (session.ready) 喋らせる。届く前の speak は 409 になる
session.on('session.ready', () => session.speak('ご相談ありがとうございます。'));
session.on('speak.ended', () => askNextQuestion());
await session.start();
</script>module を使えない場合は https://avacast.jp/sdk/v1.iife.js を読むと、グローバルの Avacast.AvacastSession になります。
イベントは session.ready、speak.started、speak.ended、speak.interrupted、session.ended の 5 つです。
MCP
https://api.avacast.jp/v1/mcp # Claude Code なら (追加の後、/mcp からブラウザでログイン) claude mcp add --transport http avacast https://api.avacast.jp/v1/mcp # API キーでつなぐなら claude mcp add --transport http avacast https://api.avacast.jp/v1/mcp \ --header "Authorization: Bearer sk_live_..."
URL を追加すると、MCP クライアント (Claude・Claude Code・Cursor など) がブラウザを開きます。管理画面のアカウントでログインして「許可する」を押すとつながり、API キーは要りません (OAuth)。できることは管理画面と同じ役割で決まり、組織のオーナーはすべて、メンバーは見るだけです。 複数の組織に入っているときは list_organizations で ID を確かめ、各 tool の organization_id に渡します。許可した接続は管理画面の「アカウント」の「接続中のアプリ」で取り消せます。
OAuth を使えないクライアントは、管理画面の「API キー」で発行したキーを接続の Authorization に付けるか、各 tool の引数 api_key に渡します。有料化とプランの変更は create_checkout が返す URL を利用者がブラウザで開いて確定します。
- スキル (組み込み手順)
- https://avacast.jp/skill/SKILL.md
- Claude Code プラグイン
- /plugin marketplace add https://avacast.jp/plugin/marketplace.json
tools
list_organizationsget_integration_guidelist_plansget_accountlist_avatarscreate_avatarlist_voicescreate_sessionspeakinterruptget_sessionend_sessionget_usagecreate_api_keycreate_checkoutset_spending_cap
エラー
message は変わることがあります。
{
"error": {
"code": "session_not_found",
"message": "Session ses_xxxxxxxx was not found."
}
}- 400invalid_request
パラメータが不正。文字数超過や必須項目の欠落
- 401invalid_api_key
API キーが不正か失効済み、またはアカウント停止中
- 401invalid_client_token
client_token が不正か期限切れ、または別セッションのもの
- 402payment_required
月間の発話上限に到達
- 404not_found
そのパス (URL) が無い
- 404session_not_found
セッションが存在しない
- 404avatar_not_found
アバターが存在しない、または使えない
- 409session_ended
終了済み・期限切れのセッションへの操作
- 409session_not_connected
ブラウザがまだ接続していない。session.ready の後に speak する
- 409idempotency_conflict
同じ Idempotency-Key で異なる内容を送信
- 429rate_limited
呼び出し頻度の制限。Retry-After 秒待つ
- 429concurrency_limit
同時セッション数の上限。どれかを閉じる
- 429queue_full
発話キューが上限。speak.ended を待つか interrupt する
- 503gpu_unavailable
GPU の空きがない
- 503maintenance
メンテナンス中。Retry-After 秒待ってやり直す
| HTTP | code | 意味 |
|---|---|---|
| 400 | invalid_request | パラメータが不正。文字数超過や必須項目の欠落 |
| 401 | invalid_api_key | API キーが不正か失効済み、またはアカウント停止中 |
| 401 | invalid_client_token | client_token が不正か期限切れ、または別セッションのもの |
| 402 | payment_required | 月間の発話上限に到達 |
| 404 | not_found | そのパス (URL) が無い |
| 404 | session_not_found | セッションが存在しない |
| 404 | avatar_not_found | アバターが存在しない、または使えない |
| 409 | session_ended | 終了済み・期限切れのセッションへの操作 |
| 409 | session_not_connected | ブラウザがまだ接続していない。session.ready の後に speak する |
| 409 | idempotency_conflict | 同じ Idempotency-Key で異なる内容を送信 |
| 429 | rate_limited | 呼び出し頻度の制限。Retry-After 秒待つ |
| 429 | concurrency_limit | 同時セッション数の上限。どれかを閉じる |
| 429 | queue_full | 発話キューが上限。speak.ended を待つか interrupt する |
| 503 | gpu_unavailable | GPU の空きがない |
| 503 | maintenance | メンテナンス中。Retry-After 秒待ってやり直す |