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

    任意のラベル。利用状況の絞り込みに使います。

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 文字まで。

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 文字まで。

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 文字まで。

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_organizations
  • get_integration_guide
  • list_plans
  • get_account
  • list_avatars
  • create_avatar
  • list_voices
  • create_session
  • speak
  • interrupt
  • get_session
  • end_session
  • get_usage
  • create_api_key
  • create_checkout
  • set_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 秒待ってやり直す