メインコンテンツへスキップ

AI機能

Hushscript開発者向けAPI

AIエージェントと自動化のために構築されたRESTサーフェスで、他のすべてと同じアカウント、同じ残高、同じトークンの上で動作します。

Hushscriptは、MCPクライアントを動かすよりHTTPエンドポイントを直接呼び出したい エージェントやスクリプトのために、素のREST呼び出しにも応答します。ここでもすべては あなた自身のアカウント、あなた自身の残高、あなた自身のベアラートークンの範囲内で完結し、 文字起こし自体の料金体系や保存方法が変わることは一切ありません。

クイックスタート

APIにはパーソナルアクセストークンが必要で、それを手に入れる方法は2つあります。人が アカウント内のMCPページトークンで トークンを作成し、そのスコープを選び、分数の購入を許可するかどうかを決める方法。あるいは、 人を介さずエージェントが自分自身のアカウントを開設する方法です。POST /v1/agent/accounts が有料のサインアップを開始し、POST /v1/agent/accounts/{signup_id}/claimが一度きりの クレームシークレットと引き換えに実際のアカウントと最初のトークンを渡します。いずれの場合も トークンは一度だけ表示され、hsr1:<region>:pat.<id>.<secret>の形をしています。MCP サーバーのOAuthサインインを通じて発行されたトークンもここで使えます。接続 をご覧ください。トークンから他のトークンを発行、一覧表示、取り消すことは決してできず、 1つのアカウントが持てるアクティブなトークンは最大25個です。認証情報のローテーションを 含む、エージェントアカウントの一連の流れは自動運用の解説をご覧ください。

トークンを手に入れたら、直接APIを呼び出します。

curl https://api.hushscript.com/v1/account \
  -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"
{
  "balance_seconds": 0,
  "held_seconds": 0,
  "credits_expire_at": null,
  "card_on_file": false,
  "data_region": "eu",
  "limits": {
    "max_active_jobs": 3,
    "max_daily_seconds": 36000,
    "active_jobs": 0,
    "daily_seconds_used": 0
  }
}

これは秒単位の残高、実行中のジョブによって保留されている秒数、クレジットの有効期限、 カードが保存されているかどうか、データリージョン、そして受け入れ制限 (max_active_jobsmax_daily_seconds、および現在の使用量)を返します。新規 アカウントは残高ゼロから始まります。POST /v1/uploadsはカードではなく残高を確認する ため、分数がなければ3001 insufficient_balanceが返ります。残高が入るのはカード経由 です。アプリ内での一度きりのカード認証が無料30分を解放し、パックは保存済みのカードに 対して購入されるためです。

エンドツーエンドの自動化

アカウントが存在した後は、そのアカウントをアプリ内で人が開設した場合でも、エージェント が/v1/agent/accountsを通じて開設した場合でも(自動運用参照)、すべて 人を介さずに実行できます。唯一残るブラウザでの操作はエージェント自身が行うこともできます。

  1. アカウントを読み取る。 GET /v1/accountcard_on_fileがfalseの場合は、先に カードを保存してください。

  2. カードを一度だけ保存する。 POST /v1/billing/setup-sessioncheckout_urlsession_idexpires_atを返します。

    curl -X POST https://api.hushscript.com/v1/billing/setup-session \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"
    {
      "checkout_url": "https://checkout.stripe.com/c/pay/cs_live_a1B2c3D4e5F6g7H8",
      "session_id": "seti_1PxYzQ2eZvKYlo2C",
      "expires_at": "2026-09-11T15:45:00Z"
    }

    自分が制御するブラウザでこのURLを開き、Stripeのホスト型ページを完了させてください。 何も課金されず、Hushscriptがカード情報を目にすることもありません。その後 GET /v1/billing/cardsがそのカードをidとともに一覧表示します。アカウントが複数の カードを保持している場合、POST /v1/billing/cards/defaultでデフォルトを切り替え られます。

  3. 分数を購入する。 GET /v1/billing/packsidsecondsamountcurrencyとともに5つのパックを一覧表示します。

    curl https://api.hushscript.com/v1/billing/packs \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"

    POST /v1/billing/purchasepackquick_payment_method_id(保存済みカードの id)、idempotency_keyを添えて呼び出すと、オフセッションでカードに請求し、新しい balance_secondsを返します。

    curl -X POST https://api.hushscript.com/v1/billing/purchase \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \
      -H "Content-Type: application/json" \
      -d '{
        "pack": "300min",
        "quick_payment_method_id": "pm_2QeT4bY7uX9mK3nP",
        "idempotency_key": "purchase-2026-09-11-02"
      }'
    { "balance_seconds": 18000 }

    これにはトークンにbillingスコープがあることと、アカウントで課金が有効になって いることが必要です。カードidのないボディや拒否されたカードは 4021 pat_purchase_requires_appで拒否され、カード発行会社が本人確認を求めるカード は4023 pat_purchase_requires_authenticationで拒否されます。いずれの場合も、 誰も完了できないページが開くことはありません。

  4. アップロードする。 POST /v1/uploadssize_bytesduration_seconds (15秒から10時間まで)、任意のtitletranscription_optionsidempotency_keyを添えて呼び出します。

    curl -X POST https://api.hushscript.com/v1/uploads \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \
      -H "Content-Type: application/json" \
      -d '{
        "size_bytes": 41943040,
        "duration_seconds": 1200,
        "title": "Q3 board call",
        "transcription_options": { "speaker_detection": true },
        "idempotency_key": "upload-2026-09-11-02"
      }'

    クレジットの保留を行い、job_idと署名付きパートURLの最初のページを返します。

    {
      "job_id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8",
      "part_urls": [
        { "n": 1, "url": "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." }
      ]
    }

    各パートをそれぞれのURLにPUTします(デフォルトでは32 MiB単位のパートで、最後の 1つだけ小さくなります)。

    curl -X PUT "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." \
      --data-binary @part-01.bin

    続きのページはGET /v1/uploads/{job}/part-urls?start=<n>から取得し、長い転送の 途中では20分のアイドルタイムアウトに十分余裕を持って POST /v1/uploads/{job}/heartbeatを呼び出してください。署名付きURLが使えない場合 や、あるパートが失敗した場合は、PUT /v1/uploads/{job}/parts/{n}がそのパートの バイト列を代わりにAPI経由で送ります。PUTを繰り返すとそのパートを置き換える だけなので、再試行しても安全です。対応するのは音声のみです。mp3、m4a、wav、 flac、ogg、opusのいずれかで、最大5 GB、サーバー側で内容を検査します。動画を アップロードする前に音声トラックを抽出してください。

  5. 開始して待つ。 署名付きURLに送信したすべてのパートのnetagを添えて POST /v1/uploads/{job}/completeを呼び出します(すべてのパートがAPI経由だった 場合はpartsを省略してください)。

    curl -X POST https://api.hushscript.com/v1/uploads/job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8/complete \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \
      -H "Content-Type: application/json" \
      -d '{
        "parts": [
          { "n": 1, "etag": "\"9f86d081884c7d65\"" }
        ]
      }'

    そのうえでGET /v1/jobs/{id}をポーリングします。stateuploadingqueuedprocessingを経てdoneまたはfailedに移り、完了したジョブには transcript_idが付きます。

    curl https://api.hushscript.com/v1/jobs/job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8 \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"
    {
      "id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8",
      "state": "done",
      "transcript_id": "trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9"
    }
  6. 結果を読み取る。 GET /v1/transcripts/{id}はメタデータと本文全体を、話者名、 検出された言語、タグ、自動削除日とともに返します。

    curl https://api.hushscript.com/v1/transcripts/trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9 \
      -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"

    GET /v1/transcriptsは一覧をページ分けして返します。

文字起こしオプションはアプリのものとまったく同じです。language_codeまたは自動検出、 speaker_detectionmedical_modelanguage_codeenesfrdeの いずれかである必要があり、+100%で課金)、translation_targets(言語ごとに+25%)、 multichannelkeyterms_prompt、自由記述のprompt、そして GET /v1/transcription-contextが一覧表示する保存済みのdictionary_idsprompt_preset_idです。

アカウントの一部は今のところMCP専用です。リンクからのインポート、トランスクリプト の編集・削除、Insights、エクスポート、辞書とプロンプトプリセットの保存、アカウント 設定には、まだ/v1/ルートがありません。これらはすべてMCPサーバーが同じ トークンでカバーします。

認証

すべての/v1/呼び出しはAuthorizationヘッダーにベアラートークンを含み、MCPサーバー が使うのと同じスコープと照合されます。

スコープ できること
transcripts:read トランスクリプト、そのメタデータ、削除済みリストを読み取り、エクスポートする
transcripts:write トランスクリプトの編集、タグ付け、翻訳、復元、削除を行う
transcribe 録音のアップロード、リンクからのインポート、文字起こしの実行を行う
insights Insightsの読み取り、生成、削除を行う
context 保存済み辞書とプロンプトプリセットを管理する
account:read 残高、利用状況、取引履歴、保留を読み取る
settings:write アカウント設定を変更する
org:read ワークスペースのメンバー、台帳、請求書、監査ログを読み取る
export アカウント全体のエクスポートをリクエストし、その状況を確認し、ダウンロードする
billing カードを保存し、分数パックを購入する

トークンのスコープの範囲外の呼び出しは、403でpat_scope_missingとなって失敗します。 billingスコープも、アカウント所有者がアプリ内でそのアカウントの課金を有効にする までは無効なままです。そのスイッチがオフのアカウントに対する課金呼び出しは同じ pat_scope_missingで失敗し、トークンを再発行してもこれは解消されません。トークン からトークンを作成、一覧表示、取り消すことはできず、1つのアカウントが持てる アクティブなトークンは最大25個です。

エンドポイント

現在稼働しているものは、それぞれ表示されたスコープによって制限されています。

メソッド パス スコープ
POST /v1/agent/accounts none
POST /v1/agent/accounts/{signup_id}/claim none
POST /v1/agent/credentials/rotate none
GET /v1/account account:read
POST /v1/billing/setup-session billing
GET /v1/billing/cards billing
POST /v1/billing/cards/default billing
GET /v1/billing/packs billing
POST /v1/billing/purchase billing
GET /v1/billing/transactions account:read
GET /v1/billing/ledger account:read
GET /v1/billing/holds account:read
POST /v1/uploads transcribe
GET /v1/uploads/{job}/part-urls transcribe
PUT /v1/uploads/{job}/parts/{n} transcribe
POST /v1/uploads/{job}/heartbeat transcribe
POST /v1/uploads/{job}/complete transcribe
GET /v1/jobs transcribe
GET /v1/jobs/{id} transcribe
GET /v1/transcripts transcripts:read
GET /v1/transcripts/deleted transcripts:read
GET /v1/transcripts/{id} transcripts:read
GET /v1/transcription-context context
GET /v1/org/members org:read
GET /v1/org/invoices org:read
GET /v1/org/ledger org:read
GET /v1/org/audit org:read

/v1/agent/accountsはまだトークンのないヘッドレスなサインアップを開始し、 /v1/agent/accounts/{signup_id}/claimは支払い済みのサインアップを実際のアカウント と最初のトークンに変え、/v1/agent/credentials/rotateは呼び出し元のトークンの後継 を発行してそれを失効させ、アカウント上の他の認証情報には一切触れません。この3つ すべてを一気通貫で扱う流れは自動運用の解説をご覧ください。

すべての一覧系エンドポイントはlimitと不透明なcursorを受け取り、最後のページ ではnullになるnext_cursorを返します。カーソルは変更せずにそのまま渡してください。 位置情報がエンコードされているため、呼び出しの間に新しい行が追加されても、ページが 飛ばされたり重複したりすることはありません。

すべての操作についてパラメータとレスポンススキーマまで含む完全かつ最新の定義は、 OpenAPIドキュメントにあります。この表 よりもそちらを正とみなしてください。スコープを問わずどのベアラートークンにも提供 されるため、クライアントはすでに持っている認証情報でこれを取得できます。

MCPインターフェース

生のHTTPよりツールの方がよいですか。MCPサーバーは、REST経由ではなくすでに MCPを話すクライアントのために、これらのエンドポイントの代わりに同じアカウントを 51個のツールの背後に置いています。

制限

トークンを使ったリクエストは1トークンあたり1分間に1,200回に制限されています。 POST /v1/billing/setup-sessionPOST /v1/billing/purchaseは、実際に行う Stripe呼び出しよりも手前で、1アカウントあたり1分間に60回というより厳しい枠を 共有します。拒否されたリクエストには、待機時間を秒数で示すRetry-Afterヘッダー 付きで429 rate_limitedが返ります。その秒数だけ待ってから再試行してください。 アップロードは5 GBと10時間が上限で、最小は15秒、アカウント自身の受け入れ制限 (max_active_jobsmax_daily_seconds)はGET /v1/accountで確認できます。

サンドボックス

ドライランモードはありません。すべての/v1/呼び出しは実際のアカウントに対して 実行され、分数の購入は実際の金額を消費します。

エラー

エラーは、以下に示すHTTPステータスで、安定した数値のcodeerrorスラッグを持つ JSONボディです。/v1/のエラーボディは固定された投影で、errorcode、そして 決まった一連の詳細キーのみを持ちます。/apiのエラー形状は固定されておらず、より 多くの情報を持つことがあります。自動化された呼び出し元が処理すべきコードは次の とおりです。

ステータス コード スラッグ 意味
401 2000 unauthorized ベアラートークンが欠落しているか無効
403 2022 pat_forbidden このルートはトークンをまったく受け付けない
403 2023 pat_scope_missing トークンにこの呼び出しに必要なスコープがない、またはアカウントで課金がオフになっている
403 4021 pat_purchase_requires_app 保存済みのカードが指定されていない、または課金が拒否された。課金は発生していない
403 4023 pat_purchase_requires_authentication カード発行会社が呼び出し側では完了できない本人確認を求めている。カード自体には問題ない
402 3001 insufficient_balance ジョブを受け付けるだけの残高がない
402 3002 card_declined 保存済みのカードが拒否された
402 3003 org_insufficient_balance このアップロードの資金源であるワークスペースのプールが不足している
404 4000 not_found 該当するジョブ、アップロード、リソースが存在しない
409 4001 wrong_state リソースがこの操作を許可する状態にない
422 1021 duration_out_of_range 申告された長さが15秒未満または10時間を超えている
429 5000 rate_limited リクエストが多すぎる。Retry-Afterを待つこと
502 6001 provider_error 上流のサービスが失敗した
500 9000 internal_error 予期しないサーバーエラー

OpenAPIドキュメントには各操作が返しうる正確なコードが記載されており、MCPサーバー はhushscript://error-codesリソースとしてカタログ全体を公開しています。

文字起こしをはじめる – 30分お試し

$1の仮承認でカードを確認し、即座に解除されます。請求は一切なく、30分の無料分もすぐに付与されます。

はじめる – 無料30分