API リファレンス
ベース URL は https://api.avacast.jp。 リクエストもレスポンスも JSON、フィールド名は snake_case、日時は ISO 8601(UTC)です。
認証
2 種類あります。用途が違うので混ぜないでください。
| 種類 | どこで使うか | できること |
|---|---|---|
| sk_live_ | サーバーのみ | 全操作 |
| client_token | ブラウザ | そのセッションの発話と中断だけ |
どちらも Authorization: Bearer <値> で渡します。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 のときのみブラウザ SDK
WebRTC の接続と発話イベントの購読をまとめた小さな SDK です。npm には出しておらず、 avacast のドメインから読み込みます(パスに版が入っています。互換を壊す変更は v2 にします)。
<video id="avatar" autoplay playsinline></video>
<script type="module">
import { AvacastSession } from 'https://avacast.jp/sdk/v1.js';
// client_token はサーバーで作ったセッションから受け取る (API キーは出さない)
const session = new AvacastSession(clientToken);
session.on('session.ready', () => session.attach(document.getElementById('avatar')));
session.on('speak.ended', () => askNextQuestion());
await session.start();
session.speak('ご相談ありがとうございます。');
</script>module を使えない場合は https://avacast.jp/sdk/v1.iife.js を読むとグローバルの Avacast.AvacastSession になります。イベントは session.ready / speak.started / speak.ended / speak.interrupted / session.ended。
/api/v1/sessionsAPI キーセッションを作る
アバターの枠を確保し、ブラウザへ渡すトークンを返します。
| パラメータ | 型 | 説明 |
|---|---|---|
| avatar_id必須 | string | 使うアバター。管理画面で確認できます。 |
| voice.language | string | 読み上げ言語。未対応の値は ja になります(エラーにしません)。既定 ja |
| voice.voice_id | string | 声の指定。edge-tts の音声名 (例 ja-JP-NanamiNeural) か、gemini:<声>:<性別>:<年代>:<調子> (例 gemini:Gacrux:female:50:calm。調子は bright/clear/soft/warm/calm/gentle/deep/friendly) か gemini:<声>:<話し方の自由文>。省略するとアバターの既定の声、それも無ければ言語と性別に合う声を選びます。 |
| voice.speed | number | 発話速度。0.8〜1.2 に丸めます(範囲外でもエラーにしません)。既定 1.0 |
| idle_timeout_seconds | number | 無発話で自動終了するまでの秒数。30〜1800 に丸めます。既定 180 |
| metadata | object | 自由なラベル。利用状況の絞り込みに使えます。 |
REQUEST
curl -X POST https://api.avacast.jp/api/v1/sessions \
-H "Authorization: Bearer $AVACAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "avatar_id": "avt_xxxxxxxx", "voice": { "language": "ja", "speed": 0.9 } }'RESPONSE
{
"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(signaling_url / ice_servers)はブラウザへ渡してよい値です。API キーは渡さないでください。
- ice_servers は RTCPeerConnection にそのまま渡してください(JS SDK は自動で使います)。
- events_url は発話イベントの SSE です。`?token=<client_token>` を付けて EventSource で開くと speak.started / speak.ended / speak.interrupted / session.ended が届きます(JS SDK は自動で購読します)。
- 1 セッションの最大長はプランで決まります(Free 5 分 / Starter 15 分 / Standard 30 分 / Business 60 分)。expires_at に入ります。延長はできないので、長い対話では張り直してください。
- 課金はセッションが開いていた時間(接続時間)で数えます。閉じ忘れは請求に乗るので、終わったら DELETE してください。無発話が続けば自動で閉じます。
- Idempotency-Key ヘッダに対応。再送で GPU の枠を二重に掴むのを防げます。
/api/v1/sessions/:id/speakAPI キー喋らせる
テキストをキューに積みます。前の発話の完了を待つ必要はありません。
| パラメータ | 型 | 説明 |
|---|---|---|
| text必須 | string | 読み上げるテキスト。1,000 文字まで。 |
REQUEST
curl -X POST https://api.avacast.jp/api/v1/sessions/ses_xxxxxxxx/speak \
-H "Authorization: Bearer $AVACAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "text": "ご相談ありがとうございます。" }'RESPONSE
{ "utterance_id": "utt_xxxxxxxx", "status": "queued", "queue_length": 1 }- 喋った長さで請求は変わりません(課金は接続時間)。ただし発話中はアイドル判定が止まります。
- キューは 1 セッションあたり 20 件まで。超えると 429 queue_full。
- Idempotency-Key ヘッダに対応。再送しても同じ発話は二度流れません。
/api/v1/sessions/:id/interruptAPI キー中断する
再生中の発話を止め、キューの未再生分を破棄します。
REQUEST
curl -X POST https://api.avacast.jp/api/v1/sessions/ses_xxxxxxxx/interrupt \
-H "Authorization: Bearer $AVACAST_API_KEY"RESPONSE
{ "interrupted_utterance_id": "utt_xxxxxxxx", "discarded_count": 2 }- 中断しても請求は変わりません(課金は接続時間で数えるため)。
/api/v1/sessions/:idAPI キーセッションの状態
いまの状態、接続時間、累計の発話時間を返します。デバッグと監視向け。
REQUEST
curl https://api.avacast.jp/api/v1/sessions/ses_xxxxxxxx \
-H "Authorization: Bearer $AVACAST_API_KEY"RESPONSE
{
"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 は実際に音声が鳴っていた時間で、参考値です。
/api/v1/sessions/:idAPI キーセッションを終える
GPU の枠を解放します。終了済みに再度呼んでもエラーにしません。
REQUEST
curl -X DELETE https://api.avacast.jp/api/v1/sessions/ses_xxxxxxxx \
-H "Authorization: Bearer $AVACAST_API_KEY"RESPONSE
{ "session_id": "ses_xxxxxxxx", "status": "ended", "connected_seconds": 312, "total_speak_ms": 7500 }- 呼ばなくても、プランごとの最大長と無発話(既定 180 秒)で自動的に閉じます。
- 自動で閉じた場合、接続時間は「閉じるべきだった時刻」までで数えます。
/api/v1/avatarsAPI キーアバター一覧
使えるアバターを返します。プリセットと自社専用のものが含まれます。
REQUEST
curl https://api.avacast.jp/api/v1/avatars \
-H "Authorization: Bearer $AVACAST_API_KEY"RESPONSE
{
"data": [
{ "id": "avt_xxxxxxxx", "name": "案内役A", "languages": ["ja", "en"], "is_preset": true }
]
}/api/v1/usageAPI キー当月の利用状況
請求の前に自分で確認できます。管理画面と同じ数字です。
REQUEST
curl https://api.avacast.jp/api/v1/usage \
-H "Authorization: Bearer $AVACAST_API_KEY"RESPONSE
{
"period": { "start": "...", "end": "..." },
"connected_seconds": 18640,
"total_speak_seconds": 4820,
"session_count": 312,
"utterance_count": 2914,
"limits": { "concurrency": 10, "monthly_connected_seconds": null }
}- connected_seconds が請求の根拠です。開いているセッションの分も今この瞬間まで含みます。
- limits.monthly_connected_seconds に達すると、新しいセッションの作成が 402 payment_required になります。
/api/v1/client/sessions/:id/speakclient_tokenブラウザから喋らせる
client_token で認証します。会話ロジックがフロントにある場合、サーバーを経由せずに済みます。
| パラメータ | 型 | 説明 |
|---|---|---|
| text必須 | string | 読み上げるテキスト。1,000 文字まで。 |
REQUEST
await fetch('https://api.avacast.jp/api/v1/client/sessions/ses_xxxxxxxx/speak', {
method: 'POST',
headers: {
Authorization: `Bearer ${clientToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ text: 'ご相談ありがとうございます。' }),
});RESPONSE
{ "utterance_id": "utt_xxxxxxxx", "status": "queued", "queue_length": 1 }- トークンは 1 セッションにしか効きません。URL のセッション ID を書き換えても 401 になります。
- 中断は /api/v1/client/sessions/:id/interrupt です。
エラー
code で分岐してください。message は改善のために変わります。
{
"error": {
"code": "session_not_found",
"message": "Session ses_xxxxxxxx was not found."
}
}| HTTP | code | 意味 |
|---|---|---|
| 400 | invalid_request | パラメータ不正(文字数超過、必須項目の欠落など) |
| 401 | invalid_api_key | API キーが不正、失効済み、またはアカウント停止中 |
| 401 | invalid_client_token | トークンが不正、期限切れ、または別セッションのもの |
| 402 | payment_required | 月間の発話上限に到達 |
| 404 | session_not_found | セッションが存在しない |
| 404 | avatar_not_found | アバターが存在しない、または使えない |
| 409 | session_ended | 終了済み・期限切れのセッションへの操作 |
| 409 | idempotency_conflict | 同じ Idempotency-Key で異なる内容を送信 |
| 429 | rate_limited | 呼び出し頻度の制限。Retry-After 秒待つ |
| 429 | concurrency_limit | 同時セッション数の上限。どれかを閉じる |
| 429 | queue_full | 発話キューが上限。speak.ended を待つか interrupt |
| 503 | gpu_unavailable | GPU の空きがない |