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

開発者向け

録音した音声の文字起こしAPI

Hushscriptの文字起こしAPIで録音した音声をアップロードし、スコープ付きのトークンでジョブの状態と文字起こし結果を取得できます。

Hushscriptの文字起こしAPIは/v1/で録音した音声を受け付け、スクリプトからジョブの状態をポーリングし、文字起こし結果を取得できます。オンラインで録音を文字起こしするためのAPIであり、ライブストリーミングや音声認識モデルを直接呼び出すエンドポイントではありません。HTTP呼び出しよりもツールを使いたいクライアントには、同じアカウント、残高、ベアラートークンで利用できるMCPサーバーもあります。

APIによる音声・動画の文字起こし

音声の文字起こしAPIは、録音した声など、事前に準備した音声ファイルを受け付けます。STT(speech-to-text)連携では録音ファイルを送信してください。マイク音声のライブストリーミングには対応していません。動画を文字起こしする場合は、音声トラックを含むMP4またはMOVファイルをそのままアップロードしてください。サーバーが音声トラックを読み取り、映像は使用しません。それ以外の動画形式は、先に音声を抽出してください。APIは動画URLを受け付けません。ブラウザでの手順は動画を文字起こしをご覧ください。

クイックスタート

APIにはパーソナルアクセストークンが必要です。取得方法は2つあります。人がアカウント内のMCPページのトークンで作成し、スコープを選び、分数の購入を許可するかどうかを決める方法です。もう1つは、人をアカウントの所有者とせず、エージェントが自分のアカウントを開設する方法です。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": 50,
    "max_daily_seconds": 144000,
    "active_jobs": 0,
    "used_today_seconds": 0
  }
}

レスポンスには、秒単位の残高、実行中のジョブが確保している秒数、credits_expire_at(分数に有効期限がないため常にnull)、カードの保存状況、データリージョン、ジョブの受付上限(max_active_jobs、max_daily_secondsと現在の使用量)が含まれます。1日あたりの上限は、そのアカウントに現在適用されている値です。固定値として実装しないでください。POST /v1/uploadsはカードの有無ではなく利用可能な分数を確認し、不足していれば3001 insufficient_balanceを返します。

文字起こしAPIの無料利用

一般向けの無料APIプランはありませんが、コードを書く前に操作を試せます。公開プレビューでは、サインイン前に1つの録音から最大5分を文字起こしできます。対象の個人アカウントはカード確認後に30分の無料分数を受け取れます。仕組みは料金ページをご覧ください。エージェントが作成したアカウントには初回の無料分数がなく、サインアップ時に購入したパックから利用を開始します。いずれも、APIで全体を処理するにはアカウントと分数が必要です。

一連の操作の自動化

人がアプリで作成したトークンでも、エージェントが有料のサインアップ後に取得したトークンでも、同じ/v1/呼び出しを利用できます(自動文字起こしを参照)。カードを保存するにはブラウザでホスト型Checkoutを完了する必要があり、エージェントが操作してもかまいません。その後のオフセッション購入でも、カード発行会社が本人認証を求めると拒否されることがあります。

  1. アカウント情報を取得します。 GET /v1/accountを呼び出します。分数の購入が必要で、card_on_fileがfalseなら、先にカードを保存します。

  2. カードを一度だけ保存します。 POST /v1/billing/setup-sessionはcheckout_url、session_id、expires_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/packsは5つのパックをid、seconds、amount、currencyとともに返します。

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

    POST /v1/billing/purchaseにpack、quick_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/uploadsにsize_bytes、duration_seconds(15秒〜10時間)、任意のtitle、transcription_options、matter_code、idempotency_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"
      }'

    matter_codeは最大64文字の自由入力で、ワークスペースに属するトークンでのみ意味を持ちます。そのワークスペースの台帳と利用状況レポートで、ジョブに紐づけて表示されます。案件コードを必須にしているワークスペースでは、指定のないアップロードをorg_matter_code_requiredで拒否します。client_codeは受け付けますが無視されます。クライアントはワークスペース管理者が案件に設定する属性だからです。

    処理に必要な分数を確保し、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で、最後のパートはそれより小さくなります。

    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、mp4またはmov(音声トラックを使用し、映像トラックは使用しません)、wav、flac、ogg、opusで、サーバー側で形式を確認します。それ以外の動画形式は、アップロード前に音声を抽出してください。

  5. 処理を開始して待ちます。 POST /v1/uploads/{job}/completeに、署名付きURLへ送信した各パートのnとetagを指定します。すべてのパートを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}をポーリングします。stateはuploading、queued、processingを経て、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_detection、medical_mode(language_codeにen、es、fr、deのいずれかが必要で、課金は+100%)、translation_targets(言語ごとに+25%)、multichannel、keyterms_prompt、自由入力のpromptを指定できます。保存済みのdictionary_idsとprompt_preset_idは、GET /v1/transcription-contextで一覧を取得できます。

一部の操作は引き続きMCPのみで利用できます。リンクからのインポート、文字起こし結果の編集・削除、Insights、エクスポート、辞書とプロンプトプリセットの保存、アカウント設定には、まだ/v1/ルートがありません。MCPサーバーは同じトークンでこれらすべてに対応します。

認証

各/v1/呼び出しはAuthorizationヘッダーにベアラートークンを指定し、MCPサーバーと同じスコープで検証されます。

スコープ 許可される操作
transcripts:read 文字起こし結果、メタデータ、削除済み一覧の読み取りとエクスポート
transcripts:write 文字起こし結果の編集、タグ付け、翻訳、復元、削除
transcribe 録音のアップロード、リンクからのインポート、文字起こしの実行
insights Insightsの読み取り、生成、削除
context 保存済み辞書とプロンプトプリセットの管理
account:read 残高、利用状況、取引履歴、確保済み分数の読み取り
settings:write アカウント設定の変更
org:read ワークスペースのメンバー、台帳、請求書、監査ログの読み取り
org:write メンバー権限の変更、組織による永続的な保管への移行予約、法的保留の設定・解除
export アカウント全体のエクスポートのリクエスト、状態確認、ダウンロード
billing カードの保存と分数パックの購入

トークンのスコープ外の呼び出しは、HTTP 403のpat_scope_missingで失敗します。billingスコープも、トークンとアカウントの両方で課金を有効にしないと機能しません。どちらかが無効な課金呼び出しは、同じpat_scope_missingで失敗します。トークンを再発行しても、アカウント側の課金は有効になりません。トークンからトークンを作成、一覧表示、取り消すことはできず、アクティブなトークンは1アカウントにつき最大25個です。

この11のスコープは呼び出し元が選択できます。pat:rotateは別のスコープで、エージェントアカウントの最初のトークンと、ローテーションで発行された後継トークンに付与されます。自分自身の置き換えのみを許可し、他のトークンは管理できません。アプリでトークンを作成する際には選択できません。

エンドポイント

本番のOpenAPIドキュメントには、37のパスに対する38のメソッド・パス操作が記載されています。以下の各操作には、表に示すスコープが必要です。

メソッド パス スコープ
POST /v1/agent/accounts none
POST /v1/agent/accounts/{signup_id}/claim none
POST /v1/agent/credentials/rotate pat:rotate
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 org:read
GET /v1/org/members org:read
PATCH /v1/org/members/{user_id} org:write
GET /v1/org/matters org:read
GET /v1/org/transcripts org:read
POST /v1/org/transcripts/{id}/hold org:write
DELETE /v1/org/transcripts/{id}/hold org:write
POST /v1/org/custody org:write
GET /v1/org/invoices org:read
GET /v1/org/ledger org:read
GET /v1/org/ledger.csv org:read
GET /v1/org/usage org:read
GET /v1/org/usage.csv org:read
GET /v1/org/audit org:read
GET /v1/org/audit.csv 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に対応するクライアント向けに、同じアカウントの操作を56のツールで提供します。公開するのは、接続したトークンのスコープで許可されたツールだけです。

利用上限

人のアカウントのトークンによるリクエストは、トークンごとに1分あたり1,200回までです。エージェントアカウントでは、ローテーションしたトークンも含め、アカウント全体でこの上限を共有します。PATでStripeを呼び出す課金ルートには、アカウントごとに1分あたり60回という別の上限があります。対象は設定セッション、購入、デフォルトカードの変更、カードの削除、カード一覧のキャッシュミスです。通常のレート制限では429 rate_limitedと、待機秒数を示すRetry-Afterを返します。指定された時間を待ってから再試行してください。エージェントアカウントの購入と、人のアカウントのPATによる購入には、アカウントごとに直近24時間で3回までという共通の試行上限があります。エージェントのサインアップ時の購入も、試行枠を確保した後のカード拒否やエラーも数に含みます。人がブラウザセッションで行う購入は対象外です。試行上限による拒否は、HTTP 429と4038 agent_purchase_capped、Retry-Afterを返します。録音は15秒〜10時間に対応します。GET /v1/accountは現在の受付上限(max_active_jobs、max_daily_seconds)を返します。

サンドボックス

一般的な文字起こし用サンドボックスはありません。通常の/v1/呼び出しは実際のアカウントを操作し、購入には実際の支払いが発生します。例外はサインアップの検証です。POST /v1/agent/accountsはdry_run: trueを受け付け、アカウントの取得に使えないdry_形式のサインアップIDを返します。Stripeセッションもアカウントも作成しません。

エラー

エラーは、以下のHTTPステータスとともに、固定の数値codeとerrorスラッグを含むJSONボディで返します。/v1/のエラーボディは、error、code、固定された詳細キーの集合で構成され、形式は固定です。/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 4038 agent_purchase_capped アカウントのトークン購入の試行枠を使い切った。Retry-Afterを待つ
429 5000 rate_limited リクエストが多すぎる。Retry-Afterを待つ
502 6001 provider_error 上流サービスが失敗した
500 9000 internal_error 予期しないサーバーエラー

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

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

アカウント作成前に最大5分をプレビューでき、新規の個人アカウントでは、アプリで初めてアップロードしたファイルも無料でプレビューできます。全体の文字起こしにはアカウントと分数が必要です。対象の個人アカウントは、カード確認の後、または初回購入時に、30分の無料分を1回限り受け取れます。サブスクなし。

無料30分ではじめる