> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# プロジェクトの処理状態を取得

> 文字起こし、翻訳、リップシンクの進捗をポーリングし、完了した出力の URL を取得します。

文字起こし、翻訳、リップシンクの進捗をポーリングし、完了した出力の URL を取得します。

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/projects_status
```

## 認証と権限

<ParamField header="x-api-key" type="string" required>
  このヘッダーに VoiceCheap API キーを指定してください。同じ API キーを Authorization: Bearer で送信することもできます。OAuth アクセストークンは MCP
  でのみ使用でき、この REST エンドポイントでは使用できません。
</ParamField>

必要な権限: `projects:read`.

有効な有料サブスクリプションが必要です。権限によってチーム内のロール、リソースの所有権、メディアクレジット、プランの制限が変わることはありません。

## パラメーター

<ParamField body="projectId" type="string" required>
  テキスト値。

  最小文字数: 1. 最大文字数: 200. パターン: `^[^/\\]+$`.
</ParamField>

<Accordion title="完全な入力スキーマ">
  以下の JSON Schema は、ディスカバリーで公開される正確なフィールド名、ネストされた型、デフォルト値、範囲、許容値を保持しています。フィールド間の追加ルールは操作の注意事項に記載されています。

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      }
    },
    "required": ["projectId"],
    "additionalProperties": false
  }
  ```
</Accordion>

## リクエスト例

例に記載されたリソース識別子とメディアキーを、ご自身のアカウントで返された値に置き換えてください。同じ変更操作を再試行する場合は、リクエスト識別子を変更しないでください。

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_status' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"projectId":"project_launch_2026"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    projectId: 'project_launch_2026',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_status', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.VOICECHEAP_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(input),
  });
  const body = await response.json();
  if (!response.ok) throw new Error(body.code + ': ' + body.message);
  console.log(body);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/projects_status",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"projectId": "project_launch_2026"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## レスポンス

初回実行が成功すると、操作結果を data に格納して HTTP 200 を返します。同じリクエストを再送した場合は、代わりに保存済みリクエストの状態を返すことがあります。例はサポートされるレスポンスの一例であり、すべての任意フィールドを示すものではありません。

文字起こしを埋め込まずに、処理の進捗と完了した出力の URL を返します。

<ResponseExample>
  ```json HTTP 200 theme={null}
  {
    "data": {
      "projectId": "project_launch_2026",
      "projectName": "Product launch",
      "originalVideoUrl": "https://media.example.com/launch/original.mp4",
      "originalLanguage": "fr",
      "targetLanguage": "english",
      "duration": 75,
      "createdAt": 1792152000000,
      "workflow": "translation",
      "transcriptionStatus": "success",
      "actualProgressStep": "done",
      "translationAndTranscriptionProgress": 100,
      "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
      "translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
      "dubbingStep": "done",
      "dubbingProgress": 100,
      "status": "success",
      "translatedVideoUrl": "https://media.example.com/launch/english.mp4",
      "translatedAudioUrl": "https://media.example.com/launch/english.mp3"
    }
  }
  ```
</ResponseExample>

## 結果フィールド

| フィールド | 説明 |
| - | - |
| `data.projectId` | 親プロジェクトの識別子。 |
| `data.projectName` | プロジェクト名。 |
| `data.originalVideoUrl` | 保存されている元のメディア URL、または空文字列。 |
| `data.originalLanguage` | ソース言語、または unknown。 |
| `data.targetLanguage` | プロジェクトに設定された最初の対象言語。デフォルトは english。すべての言語ワークの一覧ではありません。 |
| `data.duration` | メディアの長さ。秒単位。 |
| `data.createdAt` | プロジェクトの作成時刻（Unixミリ秒）。 |
| `data.workflow` | transcription または translation。 |
| `data.transcriptionStatus` | processing、success、failed のいずれか。 |
| `data.actualProgressStep` | 現在のプロジェクトステップ。文字起こしが完了し、吹き替えが続行中の場合は、吹き替えのステップに置き換えられます。 |
| `data.translationAndTranscriptionProgress` | 任意の保存済み文字起こし進捗。 |
| `data.status` | 現在のワークフローの processing、success、failed のいずれか。 |
| `data.workId` | 最新の言語別作業データに最新翻訳バージョンがある場合に含まれます。 |
| `data.translatedVersionId` | 最新の言語別作業データの、最新バージョン識別子。 |
| `data.dubbingStep` | そのバージョンの任意の吹き替えステップ。 |
| `data.dubbingProgress` | そのバージョンの任意の吹き替え進捗。 |
| `data.translatedVideoUrl` | 正常に完了したバージョンに動画 URL がある場合に含まれます。 |
| `data.translatedAudioUrl` | 正常に完了したバージョンの場合に含まれます。音声 URL が保存されていない場合は空文字列。 |
| `data.lipSync` | 任意の最新リップシンク項目。jobId、status、videoUrl、errorMessage、公開 type、createdAt、および任意の requestedAt、completedAt、failedAt、timedOutAt、activeSpeakerDetectionEnabled を含みます。 |
| `data.error` | プロジェクト処理、翻訳、またはリップシンクが失敗した場合の、任意の公開 \{code,message}。 |

## 操作の注意事項

* このアクションで projects\_create、translations\_create、translations\_start、translations\_dub、lipsync\_create の状態をポーリングしてください。文字起こしは transcripts\_get で別途取得します。
* 認証とレート制限が適用されるこの状態読み取りは、月間のアクション呼び出し枠を消費しません。
* 翻訳については、最後に作成された言語別ワークとその最新バージョンを追跡します。複数言語の状態全体を取得するには、projects\_get または translations\_list を使用してください。
* 文字起こしのみのプロジェクトは、文字起こしが終了すると成功になります。完了済みの吹き替え出力も、リップシンクの進行中は processing のままになる場合があり、最新のリップシンクが失敗した場合は failed になる場合があります。
* ハンドラーは、内部のステータス結果から必ず transcripts を除去します。ダイナミック字幕の完了フィールドはないため、それらは projects\_get をポーリングして確認してください。
* 保存された失敗は、VoiceCheap のエラーコードと固定メッセージを返します。コードとリソースの現在の状態を使って、復旧方法を判断してください。

## 使用量

このステータスまたは使用量の確認操作は、月間 API/MCP 呼び出し枠を消費しません。認証、有料アクセス、所有権、レート制限は引き続き適用されます。

## エラー

| HTTP ステータス | コード | 意味または対処方法 |
| - | - | - |
| 400 | `CREDENTIAL_IN_QUERY` | access\_token または api\_key クエリパラメーターに認証情報が指定されています。認証情報はヘッダーで送信してください。 |
| 400 | `VALIDATION_ERROR` | スキーマに従って入力を修正してください。無効な値や整合性のない値は実行前に拒否されます。 |
| 401 | `API_KEY_EXPIRED` | API キーの有効期限が切れています。 |
| 401 | `INVALID_API_KEY` | 有効期限内の有効な API キーを指定してください。 |
| 401 | `INVALID_CREDENTIAL` | Authorization ヘッダーの形式が不正、または x-api-key と競合しています。 |
| 401 | `MISSING_CREDENTIAL` | 利用可能なヘッダー認証情報が指定されていないか、4096文字を超えています。 |
| 401 | `USER_NOT_FOUND` | 認証情報に対応するアカウントはすでに存在しません。 |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | 認証情報のユーザーが複数のチームに属しているため、課金コンテキストが曖昧です。 |
| 403 | `FORBIDDEN` | 認証済み実行者は、このプロジェクトにアクセスできません。 |
| 403 | `INSUFFICIENT_SCOPE` | 必要な権限をすべて付与するか、別の認証情報を使用してください。 |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | アカウントの連携上限を確認できませんでした。 |
| 403 | `SUBSCRIPTION_REQUIRED` | 有効な有料サブスクリプションを使用してください。 |
| 403 | `TEAM_OWNER_NOT_FOUND` | 実効的なチームオーナーのアカウントが見つかりませんでした。 |
| 404 | `PROJECT_NOT_FOUND` | アクセス可能なアカウントにこのプロジェクトは存在しません。 |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | Retry-After がある場合は指定時間を待ち、バックオフを使用してください。 |
| 500 | `INTERNAL_ERROR` | 変更操作を再試行するか判断する前に、保存済みリクエストの状態とリソースの履歴を確認してください。 |
| 503 | `SERVER_RESTARTING` | サーバーが再起動中です。少し待ってから再試行し、変更操作では同じリクエスト識別子を使用してください。 |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["projects:read"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.