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

# 音声 アップロードURL発行

> ファネル・会員サイトの音声要素で再生する音声をアップロードするためのPresigned POST情報を発行します。2段階アップロードの1段階目です。

1. このエンドポイントで `presigned_post` と `media_id` を取得します。
2. `presigned_post.url` に `presigned_post.fields` を全て含めた `multipart/form-data` でファイル本体をPOSTします（`file` は最後）。
3. アップロード完了後、`POST /media/audios/complete` で確定すると最適化（エンコード）処理が開始されます。

最大ファイルサイズは5GB、発行URLの有効期限は10800秒です。


`POST`

```
https://api.utage-system.com/v1/media/audios/upload-url
```

ファネル・会員サイトの音声要素で再生する音声をアップロードします。アップロードは2段階で行います。

1. このエンドポイントで `presigned_post`（アップロード先URLとフォームフィールド）を取得します。
2. 取得した `presigned_post.url` に対し、`presigned_post.fields` を全て含めた `multipart/form-data` でファイル本体をPOSTします（`file` フィールドは最後に追加）。
3. アップロード完了後、[アップロード完了通知](/api-reference/media/audio-complete) を呼び出すと、最適化（エンコード）処理が自動で開始されます。


## OpenAPI

````yaml POST /media/audios/upload-url
openapi: 3.0.3
info:
  title: UTAGE API
  description: |
    UTAGEのパブリックAPIです。ファネル、配信アカウント、シナリオ、メディアなどのリソースをプログラムから操作できます。

    ## 認証
    すべてのリクエストにAPIキーによるBearer認証が必要です（要素タイプエンドポイントを除く）。

    ```
    Authorization: Bearer {api_key}
    ```

    APIキーはUTAGE管理画面から発行できます。

    ## レート制限
    リクエスト数には以下の制限があります。

    | 分間上限 | 日間上限 |
    |----------|----------|
    | 60リクエスト/分 | 10,000リクエスト/日 |

    レスポンスヘッダーで現在の使用状況を確認できます。

    | ヘッダー | 説明 |
    |----------|------|
    | X-RateLimit-Limit | 分間の上限値 |
    | X-RateLimit-Remaining | 分間の残りリクエスト数 |
    | X-RateLimit-Reset | 制限がリセットされるUNIXタイムスタンプ |

    上限を超えた場合は `429 Too Many Requests` が返されます。

    ## エラーレスポンス
    エラー時は以下の形式で返されます。

    ```json
    {
      "error": {
        "code": "error_code",
        "message": "エラーメッセージ"
      }
    }
    ```
  version: '1.0'
  contact:
    name: UTAGE サポート
servers:
  - url: https://api.utage-system.com/v1
    description: UTAGE API
security:
  - BearerAuth: []
tags:
  - name: ファネル
    description: ファネルの作成・更新・一覧取得
  - name: ステップ
    description: ファネル内のステップの作成・更新・並び替え
  - name: ページ
    description: ステップ内のページの作成・更新・取得・削除
  - name: 配信アカウント
    description: 配信アカウントの作成・一覧取得
  - name: シナリオ
    description: シナリオの作成・一覧取得
  - name: メディア
    description: 動画・音声・通常メディアの一覧取得とアップロード
  - name: 要素タイプ
    description: ファネルページ・HTMLメールの要素タイプ定義、LINEメッセージタイプ・配信条件タイプの取得（認証不要）
  - name: ファネル統計
    description: ファネルの集計データ・登録者・登録経路の取得（プレビュー）
  - name: 配信メッセージ
    description: 配信メッセージの作成・更新・テスト送信・配信統計、置き換え文字の取得（プレビュー）
  - name: 読者
    description: 読者の作成・更新・取得、ラベル・配信履歴・開封/クリック履歴の取得（プレビュー）
  - name: LINE
    description: LINE友だち・カスタム送信者・1対1チャット・テンプレートの操作（プレビュー）
  - name: ラベル・共通読者・登録経路
    description: ラベル・共通読者・アクション・登録経路の操作（プレビュー）
paths:
  /media/audios/upload-url:
    post:
      tags:
        - メディア
      summary: 音声 アップロードURL発行
      description: >
        ファネル・会員サイトの音声要素で再生する音声をアップロードするためのPresigned
        POST情報を発行します。2段階アップロードの1段階目です。


        1. このエンドポイントで `presigned_post` と `media_id` を取得します。

        2. `presigned_post.url` に `presigned_post.fields` を全て含めた
        `multipart/form-data` でファイル本体をPOSTします（`file` は最後）。

        3. アップロード完了後、`POST /media/audios/complete` で確定すると最適化（エンコード）処理が開始されます。


        最大ファイルサイズは5GB、発行URLの有効期限は10800秒です。
      operationId: createAudioUploadUrl
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AudioUploadUrlRequest'
      responses:
        '200':
          description: アップロードURL情報
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/MediaUploadUrlResponse'
        '400':
          description: 拡張子なし・許可外MIMEタイプ・フォルダ不一致などの不正なリクエスト
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: ユーザーが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: not_found
                  message: ユーザーが見つかりません
        '422':
          description: ストレージ容量の上限超過
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: storage_limit_exceeded
                  message: 容量を超えました。ファイルを削除してください。
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
components:
  schemas:
    AudioUploadUrlRequest:
      type: object
      required:
        - filename
        - filetype
      properties:
        filename:
          type: string
          description: 'ファイル名（拡張子を含む。例: podcast.mp3）'
        filetype:
          type: string
          enum:
            - audio/mpeg
            - audio/mp4
            - audio/aac
            - audio/wav
            - audio/x-wav
          description: 音声のMIMEタイプ
        folder_id:
          type: string
          description: 音声フォルダのID（任意）。未指定時はルート直下
    MediaUploadUrlResponse:
      type: object
      properties:
        media_id:
          type: string
          description: 発行されたメディアID。アップロード完了通知で使用します
        presigned_post:
          type: object
          description: Presigned POSTのアップロード先とフォームフィールド
          properties:
            url:
              type: string
              description: アップロード先URL（このURLへmultipart/form-dataでPOST）
            fields:
              type: object
              description: >
                POSTフォームに含めるフィールド。全フィールドをフォームに追加し、最後に `file`
                フィールド（ファイル本体）を追加してください。
              properties:
                key:
                  type: string
                Content-Type:
                  type: string
                acl:
                  type: string
                X-Amz-Algorithm:
                  type: string
                X-Amz-Credential:
                  type: string
                X-Amz-Date:
                  type: string
                Policy:
                  type: string
                X-Amz-Signature:
                  type: string
        expires_at:
          type: string
          description: アップロードURLの有効期限
        notice:
          type: string
          description: 通常メディアに動画MIMEタイプを指定した場合のみ付与される案内
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: エラーコード
            message:
              type: string
              description: エラーメッセージ
            details:
              type: object
              nullable: true
              description: エラーの補足情報（retry_afterやフィールド別エラー等）。エラー種別により含まれる場合があります。
  responses:
    Unauthorized:
      description: 認証エラー。APIキーが無効または未指定。
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: unauthorized
              message: 認証に失敗しました
    RateLimitExceeded:
      description: レート制限超過。時間を空けて再試行してください。
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: rate_limit_exceeded
              message: リクエスト上限を超えました。しばらく時間を空けて再試行してください
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: APIキーをBearerトークンとして指定

````